Computer
Mobile
buttons board 1 kiCAD files
buttons board 2 kiCAD files
CRduino board kiCAD files
Small button openSCAD file
Large button openSCAD file
Box model openSCAD file
Box model openSCAD file for SVG export
Box svg model makercase.com file for laser cut
First CAD model of the top panel for the Braille text recorder, with the holes for key buttons and possible real dimensions (made with openSCAD).
Through the initial process I used an arduino to make the prototype:
PISO: parallel-in serial-out
parallel-in serial-out is a way to read several simultaneous inputs and convert them to a serial signal. This is done with an IC specifically built to capture multiple inputs and generate a signal transmitted trough an individual pin. A clock is used to synchronize the elements of the serial signal and the reader of the signal (in this case the Arduino). For example, if there are six inputs (i0, i1... i6), and at one time i2, i3 and i5 are activated, the IC converts the inputs to "0 0 1 1 0 1" meaning i0 = 0, i1 = 0, i2 = 1, i3 = 1, i4 = 0, i5 = 1.
I did several tests with the IC NTE4014B for parallel reading of six buttons were unsuccesful. For the output devices assignment I set up an Arduino, an LCD and six buttons and was able to read the input from all six buttons and display it on the LCD. To acheve this, I used a for loop that constantly reads all the buttons, but this method probably won't work for the actual keyboard. For future tests I will:
Visit to Hellen Keller Institute
Hellen Keller Institute is a public school for students with visual impairments. It is located in San José, Costa Rica.
I visited the school to talk about this project. Professor Enrique Quirós recived me and we had a conversation about the school, Braille code for students, Perkins machines, resources for the visually impaired and the project.
From that conversation, this are the main ideas:
Braille is an essential tool for people with visual impairments.
Perkins machines are expensive for most students, they are alse heavy and noisy.
The paper for the Perkins machines is expensive.
Access to Braille printed material is limited.
Printers, engravers, materials, and most accesories for the visually impaired are expensive.
A digital Braille keyboard would be good replacement for the Perkins machine. It has the disadvantage of not having a way to display the text, but for students without acces to any other Braille machine, it would be a good opprtunity.
The school offered the space for testing the keyboard, so, in a future visit, some students and teachers will test it.
Programming the keyboard
After creating the crduino and the testing keyboard, I started programming the keyboard.
int buttonArray[] = {2,3,4,7,8,9,10,11,12};
// this array will hold the pin value for each button
for (int thisPin = 0; thisPin < 9; thisPin++)
{
pinMode(buttonArray[thisPin], INPUT);
}
Then, I needed the code to stop and wait for an input from the keyboard. And since Braille code is created by combinations of keys, whenever and while a button or buttons were pressed, the code should keep reading all the inputs to change the state of the pressed keys. Finally, a character would be registered when all the keys went back to released state, meaning a character was input, and a new one may be input next. For those two tasks I used "while" loops in combination with AND and OR conditions.
while ( digitalRead(buttonArray[0]) == HIGH &&
digitalRead(buttonArray[1]) == HIGH &&
digitalRead(buttonArray[2]) == HIGH &&
digitalRead(buttonArray[3]) == HIGH &&
digitalRead(buttonArray[4]) == HIGH &&
digitalRead(buttonArray[5]) == HIGH &&
digitalRead(buttonArray[6]) == HIGH &&
digitalRead(buttonArray[7]) == HIGH &&
digitalRead(buttonArray[8]) == HIGH )
{
//while all the buttons are released, wait
}
while ( digitalRead(buttonArray[0]) == LOW ||
| digitalRead(buttonArray[1]) == LOW ||
digitalRead(buttonArray[2]) == LOW ||
digitalRead(buttonArray[3]) == LOW ||
digitalRead(buttonArray[4]) == LOW ||
digitalRead(buttonArray[5]) == LOW ||
digitalRead(buttonArray[6]) == LOW ||
digitalRead(buttonArray[7]) == LOW ||
digitalRead(buttonArray[8]) == LOW )
{
if(digitalRead(buttonArray[0]) == LOW) {stringArray[0] = digitalRead(buttonArray[0]);}
if(digitalRead(buttonArray[1]) == LOW) {stringArray[1] = digitalRead(buttonArray[1]);}
if(digitalRead(buttonArray[2]) == LOW) {stringArray[2] = digitalRead(buttonArray[2]);}
if(digitalRead(buttonArray[3]) == LOW) {stringArray[3] = digitalRead(buttonArray[3]);}
if(digitalRead(buttonArray[4]) == LOW) {stringArray[4] = digitalRead(buttonArray[4]);}
if(digitalRead(buttonArray[5]) == LOW) {stringArray[5] = digitalRead(buttonArray[5]);}
if(digitalRead(buttonArray[6]) == LOW) {stringArray[6] = digitalRead(buttonArray[6]);}
if(digitalRead(buttonArray[7]) == LOW) {stringArray[7] = digitalRead(buttonArray[7]);}
if(digitalRead(buttonArray[8]) == LOW) {stringArray[8] = digitalRead(buttonArray[8]);}
}
This code reads the buttons and shows the reading using serial monitor of the arduino ide. It can read one or several buttons. So far, the test has 9 buttons, and all 9 are read correctly. Also, the debounce circuit of the keyboard seems to be working well for the project. These are examples of the serial readings (the asterisks line separates each reading, the ones represent pressed buttons):
**********
100000000
**********
001000000
**********
000100000
**********
000000100
**********
001000100
**********
000101000
**********
011100000
**********
110100110
**********
The six Braille dots
With a working prototype, the next step is to learn how to convert keys combinatios to characters. I found a very good video explanation about Perkins Braillers and Braille code on the Statewide Vision Resource Centre website:
Also, a brief and very clear video about the basics of Braille code:
Mapping the Braille code
I changed the code to use six buttons, in order to start interpreting combinations of keys as characters.
Then, I changed the programming code to use six buttons, and to display the input reading in an arrange resembling the Braille cell. The next images shows a screenshot of the serial monitor with the corresponding Braille code and letter added:
Next step will be to translate each combination to its corresponding alphabet letter.
The first ten letters
After getting the machine to assign each button to its corresponding dot in the Braille cell, I needed to translate different combinations to letters.
Using an "if" statement to evaluate an array of Strings (this will be changed to an array of chars), and according to the activated positions, a letter is displayed.
This is the code to translate the array into the letter "f":
if( stringArray[0] == "1" &&
stringArray[1] == "1" &&
stringArray[2] == "0" &&
stringArray[3] == "1" &&
stringArray[4] == "0" &&
stringArray[5] == "0" )
Serial.println("f");
And this is the serial output and Braille cell for letter "f":