Introduction: Voice Activated Accessible Shelf
Tikkun Olam Makers (TOM) hosted a maker event at NOVA Labs. It was a weekend long event to build accessible projects for people with special needs. I had long had an idea for a voice activated accessible shelf for my son and this was the perfect venue to get the extra help I needed to make it.
My son uses a wheelchair and has limited mobility which makes it difficult to get to his stuff. I'm constantly hearing -- "Mom, can you get me my DS. Mom, can you get me a pencil..." I needed a set of shelves always at the right height, with nothing underneath it so that John could drive up and get what he needed without help.
Although I don't have pictures and dimensions for every step, I think it's fleshed out enough that someone who really wanted to build it could.
Step 2: Concept
My original idea was based on an instructable that I ran across -- Automated Spice Rack.
In it, an actuator is used to lift a set of shelves using drawer slides as a track. I wanted to use this concept with a second motor that would push out the shelf at a correct height. I wanted it to be voice activated since it's hard for John to reach buttons, and it isn't always easy to push them either.
The makers at the event took this concept and made some adjustments. They substituted a motor/lead screw for the linear actuator. This lead screw is mounted to a face plate that glides up and down via drawer slides. The shelves are mounted onto this face plate, but instead of the drawers being pushed out -- they rotate as they are raised past a cam. This eliminated the need for another motor.
Over the long weekend that they worked on it, they managed to build a proof of concept that showed they could lift the shelves and get them to rotate. Over the next months, they found a motor that could drive the shelves. I was able to take this foundation that they built and finish it by adding the button and voice control.
Step 3: Motor Assembly
The motor assembly is made up of the motor, motor mount, threaded rod, coupler to attach motor shaft to threaded rod, nut to translate up and down the threaded rod, and 2x4/bracket to attach the nut to the shelf face plate.
The motor linked to above is motor used for this project. It took some time to find a motor that could drive the shelves. This motor is mounted to the base of the shelf system. A coupler (the one linked to above is just an example, it is not the actual coupler used) is used to attach the motor shaft to the threaded rod. A nut (again an example is linked to above, but that is not the actual nut used) is screwed on to a 2x4 and the 2x4 slides on to the threaded rod. A U-shaped bracket (this piece was welded together by the makers) was attached to the 2x4. The other end of the bracket was attached to the face plate.
Step 4: Shelf Assembly
1. Face plate -- The face plate is a thick plywood (1") that attaches to the front of the shelving system through drawer slides. There is a slot through the face plate to allow the cam to stick through. The bottom of the face plate is bolted to the U-shaped bracket that connects to the 2x4 that travels up and down the threaded rod of the motor assembly. The shelves are mounted on to the front of the face plate.
2. Shelves -- The shelves are pie shaped wedges. The reason for the shape is two-fold. First, John is unable to reach into corners, so this shape is the most efficient to maximize where he can reach. Second, the shape looks pretty cool. The shelves are attached by a spring hinge to a spacer board so that there is room for the hinge. This board is then mounted on to the face plate.
Step 5: Cabinet Assembly
The cabinet assembly is a box enclosure made out of plywood, some edging, and plexiglass. This could have been made solid, but the thought was that it might be fun to watch the inner-workings as the shelf goes up and down, so plexiglass was used for two of the side walls.
And to make the experience even more fun, a LED light strip was added to the inside to light up the box while the shelves traveled.
The front face of the cabinet has a slot so that the motor bracket can move the faceplate up and down. Also, the cam is mounted on to the front of the cabinet and sticks through the slot on the faceplate.
Step 6: The Brains
Here is a brief description of how to wire everything up:
1. arduino -- The Motor shield sits directly on top of the arduino. A usb cable goes from the arduino to a wall outlet using a usb-wall-outlet charger.
2. Power supply -- Port 8 & 9 go to a power cord that leads to a wall outlet. Port 4 goes to the Motor Shield PWR(-), and Port 1 goes to the Motor Shield PWR(+)
3. Touch Capacitive Buttons -- The buttons are used as a back-up to the voice control since the voice control can be a little flaky.
GND goes to Breadboard(-),
VOD to Breadboard(+),
OUT to Motor Shield digital pins 10, 11, and 12 (for each button).
4. Motor -- The motor being used has an encoder, however, the encoder information isn't being used. At first, I tried to code the arduino to run the motor using the encoder information to lift the shelf system to the correct height. It was a bit flaky, so instead, I re-coded the arduino to have the motor go up, down, and stop, based on the user command. This set-up doesn't need the encoder since the user manages the position of the shelf instead. The specs for the wires for this particular motor are as follows --
Orange Wire to Breadboard (+) – Sensor voltage
Yellow Wire to NotUsed -- (Channel A)
Brown Wire to NotUsed – (Channel B)
Green Wire to Breadboard (-)
Red Wire to Motor Shield 3 (SK6)
Black Wire to Motor Shield 4 (SK6)
5. Limit Switch -- The limit switch is mounted onto the inside of the cabinet assembly. The purpose is to cut the motor off when the 2x4/nut/bracket reaches the bottom of the threaded rod.
Red Wire to Not Used -- although, I wonder if this should be connected to ground as well
Black to Breadboard (-)
Orange to Motor Shield digital pin 13
6. Geeetech Voice Recognition -- This is used to give voice commands to the arduino to operate the motor.
GND to Breadboard(-)
RXD to Motor Shield digital pin 1 (Serial TX)
TXD to Motor Shield digital pin 0 (Serial RX)
VCC to Breadboard(+)
7. LED tape strip -- This was used to light up the inside of the shelf cabinet just for fun. The motor shield was used to supply power to the light strip since it takes more than the 5 volts that the arduino can supply. If you want to use more than one color, you'd have to wire it differently using N-Channel MOSFET's (See LED light strip overview). Since I already had the motor shield, I chose to use that to drive the LED and used blue.
White wire to Motor Shield 1 (SK5)
Blue wire to Motor Shield 2 (SK5)
8. Motor Shield -- Note that the motor shield is using the arduino digital pins 8,9, and 2,3 for both channels. The only thing left to connect that wasn't mentioned above is as follows:
5V to Breadboard (+)
GND to Breadboard (-)
Step 7: The Brains... Voice Control
This instructable was very helpful in setting up the Geeetech Voice Recognition.
A few notes from the experience --
1. When uploading code to the uno you must first unplug the RX and TX wires (in digital pins 0 and 1). This took me forever to figure out. I thought my arduino went bad since the computer couldn't upload to it, but no, just had to pull out these wires first.
2. I tried to use my Windows 10 machine to train the voice control module. Even though my computer recognized the usb, it gave a driver error. Apparently prolific-usb-to-serial-comm-port-windows is not supported in Windows 10. Supposedly you can try to load an older driver to get it to work, but I didn't have success with that. Instead I borrowed my brothers MAC and it worked with no problems.
3. Just to see how it worked, I recorded my voice first. Although it seemed to recognize other adult voices, it didn't recognize my son's very well, so I re-recorded with his voice. Note, that when I re-recorded a section, I first had to delete what was there by sending the aa01 command.
4. It says that there are 3 sections of 5 commands each, but I've only been able to recognize commands from the first section. Fortunately, I haven't needed more than 5 commands for this project. I had John record 'Up', 'Down', 'Stop', 'GittyUp', and 'Rise'.
5. The voice control has been a bit flaky. I used a test program to print out the command it thinks it is being given. Nearly every time John spoke a command, it responded with the correct command. (Sometimes it thought John said Down when he said Up -- but on the whole, it was working pretty well). However, once I put this into the shelf activation code, it often didn't even receive a command. I suspect it's because the arduino is multi-tasking and listening for the touch buttons, voice activation, and controlling the motors. Maybe it just doesn't handle all of those well. I don't know.
Step 8: The Brains... Arduino
In the arduino loop code, the arduino is 'listening' for a button push or a voice command. If the command is for going UP, it sets the direction of the motor first. It starts the motor full blast. It turns on the LED light. As the motor is going up, it checks to see if it receives another command to stop -- either by voice or button. (The way it is currently coded - any voice command will be interpreted as stop.) When it receives it, it stops the motor and turns off the LED light. If the command is for going DOWN, it sets the direction of the motor again. It turns on the motor and LED light. This time, if any command is given by voice or button -- OR if the limit switch is hit, the motor is stopped and the LED light turned off.
When I first coded this, I attempted to have the user input which shelf to go to -- then drive the motor to that location. The motor has an encoder, so by adding an interrupt, in theory, I could count how far to turn the motor for a particular shelf. In reality, it seemed I got a different count every time for varying reasons. It was difficult to control while debugging, and I nearly broke the whole thing when I didn't pull the plug fast enough when the shelf was going down and there was no way to stop it. So, eventually, I decided to abandon that approach and just go with Up, Down, and Stop.
Step 9: Final Thoughts
From conception to reality, this project was several years in the making. I'm very pleased with how it's turned out, and I'm very thankful for the fantastic makers who donated their time and gifts to help make it happen.
A couple of wrap up thoughts... I wish that the drawers would rotate a full 90 degrees instead of around 45 degrees. John just barely fits underneath and often bumps the other drawers. I attempted to add a second cam to help turn the drawer just a little more, but all that ended up happening is that the drawer got hooked on the second cam. The motor continued to drive and the threaded rod nearly bent.
I think I need to add a second limit switch at the top. Once the dog barked, and the voice activation kicked in and started sending the shelf system up. With nobody there to hit the stop button, in theory, the nut would just spin when it got to the top of the rod, but I would think that bad things could happen with the motor constantly running.
I'd like to clean up all the wires and connections, but for now, it allows me to get to everything and fiddle.
It still remains to be seen whether this shelf system is actually useful. Although, I think it will be, because just last night John got himself a tissue without even asking for any help. That right there is a victory.