WiringPi, software written by Gordon Henderson that allows "Arduino style" control of the GPIO pins from the command line in a Linux terminal

Voice Command, a package written by Steven Hickson that allows voice control of the Raspberry Pi by connecting to a Google speech-to-text service.

The end result is voice-activated control of up to three electrical outlets using the Raspberry Pi. Here's a video of the final product in action (read on for a detailed parts list, circuit diagram, and code):

A couple notes before you begin. This project is up-to-date as of December 2013, but Gordon and Steve may update their respective software in the future. If you notice any major changes to WiringPi or Voice Command that make my instructions obsolete, please leave a comment or send me a message. Also, while my previous Instructable was written to be super beginner friendly, this one is a little more advanced so it skips over a lot of the introductory material. I refer back to the single-channel version several times, instead of duplicating the content here.

Here is a list of the parts I used. Of course, if you know what you're doing you can make substitutes as needed, or shop around for cheaper suppliers. Quantities in parenthesis.

Multimeter, soldering iron, wire strippers, small Philips screwdriver. See my other Instructable for some suggestions if you don't already own tools.

Cost

The cost of this project depends heavily on what you already have lying around. If you already have a Raspberry Pi, webcam/mic and basic electronics equipment (tools, breadboard, jumper wire etc) it will only be about $40 for the wireless remote, relays and MOSFETs, and the cost goes up from there.

*My Quickcam Pro is 5 years old and I'm not sure if this exact model has been discontinued, or if it is the same thing as the "Webcam Pro 9000", which pops up on Amazon. You may need to do some poking around online to find out if your webcam is compatible with the Raspberry Pi (keep in mind that you only need the mic, and don't care about video). This wiki has an extensive list of verified peripherals.

Step 1: Open the Remote and Remove the Circuit Board

The first thing you'll need to do is open the plastic case of the remote to expose the circuit board.

1. Remove the battery cover and take the battery out for now. 2. Use a small Phillips head screwdriver to remove the single screw holding the front and back halves of the plastic case together. 3. Use needle nose pliers to bend off the keychain ring.

This exposes the underside of the circuit board, which you can remove from the case entirely to get a look at the top half. However, I find it easier to work with the circuit board attached to the front half of the case. This way, you can easily push the buttons when you're testing the circuit (next step). The battery also tends to stay in better when it's in the case. There was an unoccupied hole in the case that lined up with a hole in the circuit board - I used the small screw to attach the circuit board to the front half of the case (see the last two pictures above).

Step 2: Reverse-Engineer the Remote

This step will assume you already have basic knowledge of how a single-channel remote works. You can find a detailed explanation of that in my previous Instructable.

The basic idea here is the same - but instead of two buttons controlling a single channel (one ON and one OFF), you have six buttons controlling three channels (three ON and three OFF). Each of these buttons is connected to a pin on a chip on the circuit board (the black rectangle). Normally, these pins sit at 0V (a logical LOW). When the respective button is pressed, the pin goes up to 5V (a logical HIGH). Your ultimate goal is to "trick" the remote into thinking buttons are being pressed by sending a 5V signal from a circuit controlled by the Raspberry Pi (more on that later). In order to do that, you need to figure out which pins on the chip are connected to the pushbuttons, so you can solder jumper wires to them.

There are two complementary ways to do this. One is to just look at the traces on the back of the circuit board, and figure out which ones connect the pushbuttons to pins on the chip. You can also test this with a multimeter by testing to see which pin changes from 0V to 5V when you push each button (make sure the battery is in, or that won't work!). The latter can be a little difficult to do with just two hands, and is definitely easier if you have alligator clip attachments for your multimeter.

If you're using the exact same remote I linked to from Amazon, you should be able to follow my diagrams exactly. If not, you'll need to do some tinkering on your own to figure out which pins to solder to in the next step.

Step 3: Solder Jumper Wires to the Remote

Note: I opted for economy shipping from SparkFun for my multi-colored jumper wire. The good news is I got free shipping. The bad news is I only had red and black jumper wire available before that. The connections in this project are a little easier to keep track of if you have 8 different colors available. So, for the circuit diagrams (expertly drawn in Powerpoint), I'll use the following convention:

In the photos of my actual build, you will only see red and black wire. Of course you can use whatever colors you prefer - my intent is that the color-coding scheme in the diagrams will be easier to follow, and I apologize that it doesn't match up to my photos exactly (it was this, or miss the deadline for the Hardware Hacking contest).

Anyway - now you need to solder jumper wires to the six pins identified in the previous step, plus the negative terminal of the battery connection (this will make sure your whole circuit has a common ground later). Seven connections total, as shown in the pictures above (a "fake" photo with the color-coded wires drawn in, as well as a photo of the real thing).

Optionally, if you'd like to protect the circuit board a little better, you can drill holes in the back of the remote's original case to feed the jumper wires through. Just make sure you can keep track of which wire is which. I used a label maker since I didn't have properly color-coded wire.

Step 4: Build the Circuit

Assemble the circuit on the breadboard. If you're good at following breadboard diagrams, you can just go ahead and use the first image above. If that seems a little overwhelming, try doing it one step at a time (following the pictures in order):

1. Insert the relays and MOSFETS (six of each). Important - I didn't realize until after I made all of these diagrams that the packaging on the relays is slightly too bulky for them to occupy adjacent breadboard rows, as pictured here. You will actually need one blank row in between each relay, adding five rows of total space to the build (which shouldn't be an issue if you're already using a big 60+ row breadboard). 2. Use jumper wires to make all the +5V (red) and ground (black) connections on the breadboard. 3. Connect the breadboard to the Raspberry Pi's +5V and GND pins, and to the negative battery terminal (-) on the remote. Important: do NOT connect the positive power rail on the breadboard to the (+) battery terminal on the remote. The remote battery is 12 volts, so if you short that to your Raspberry Pi's 5V pin, bad things will happen. 4. Connect the Raspberry Pi's GPIO pins (17, 18, 22, 23, 24, and 25) to the gates (left-most pin when facing the side with the writing) of the respective MOSFETs as shown. See the color-coded table above, which matches the wire colors I used in the breadboard diagrams, for help keeping track of everything. See this page for more information about the GPIO pins and the numbering scheme (which can be confusing if you're new to Raspberry Pi, especially if you're used to Arduino). 5. Connect the wires you previously soldered onto the remote to the breadboard. I use the same color-coding convention for these wires in the diagrams above.

For an explanation of how the circuit works, see this step of my previous Instructable.

Step 5: Install WiringPi

WiringPi is a very convenient way to control the Raspberry Pi's GPIO pins, especially if you are used to Arduino. It was created by Gordon Henderson and you can find download and installation instructions here. Follow the directions on his site to download and install WiringPi on your Raspberry Pi (using the command line in a terminal).

Note: I originally found out about WiringPi through this tutorial on controlling a single LED with the GPIO pins, hosted on projects.drogon.net. It links to these download and installation instructions. WiringPi has since been moved to its own site, wiringpi.com. According to this post I believe wiringpi.com will contain the most recent updates - so in the future make sure you follow download and installation instructions from wiringpi.com and not projects.drogon.net, in case anything changes (as of December 2013, the instructions are still the same).

Step 6: Install Voice Command

In short, Voice Command is a C++ program included as part of a package called PiAUISuite (Pi Alternative User Interface Suite) written by Steven Hickson. It uses a microphone connected to your Pi to record audio, then connects to a Google speech-to-text service to convert the sounds to text that can be used to execute commands. Steve has some very helpful and extensive tutorials and YouTube videos that I highly recommend checking out before you dive into this part, and he already has it set up to do some neat things like open and play videos, Google stuff, or connect to Wolfram Alpha to try and answer questions. So, all of the credit for this goes entirely to Steve - I just took his setup and put a couple lines in the config file to control GPIO pins (using WiringPi, and of course the credit for that goes to Gordon Henderson).

I will provide all of the links that I found helpful, but it looks like he is still actively updating the project - so be sure to check his blog for updates and instructions to download and install the latest version. If you notice an update in the future, please leave a comment below with a new link.

So, as of December 2013, follow the directions in that last link to download and install PiAUISuite and Voice Command. In the next step you'll edit the config file to include voice commands for the GPIO pins.

Step 7: Edit the Voice Command Config File

In a terminal, open the Voice Command config file by typing the command

You can probably guess what each line of this code does. When the phrase before the double equals sign is detected (e.g. "light one on") the code after the double equals sign executes. You can change each phrase to whatever suits your needs (e.g. "TV on", "desk light on" etc). tts is "text to speech" and will make your personal robot assistant respond appropriately (Steve's default is "Yes sir", I prefer something a little more ego-maniacal like "At your command, master."). The rest is the digital equivalent of pushing and releasing a button on the remote:

gpio write 0 1: set GPIO pin 17 to HIGH (ultimately sending a 5V signal to the remote, equivalent to pushing the button). See note below about pin numbering convention.

sleep 1: hold the pin HIGH for one second (equivalent of holding the button down)

gpio write 0 0: set the pin back to LOW (equivalent of releasing the button)

Be careful to get the syntax right -primarily no spaces immediately before or after the double equals signs.

Follow the on-screen directions to save the config file once you've added this code (ctrl+x to exit then y to save).

*Apparently WiringPi is compatible with two different numbering conventions - the Raspberry Pi GPIO pin numbers (17, 18 etc) or its own system that starts numbering the pins at 0. So, the following block of code will also work. You can use whatever convention you prefer.

I skipped using WiringPi pin 2 so I could stick with "pairs" of pins that were across from each other on the header for on/off (for the first two channels, at least). Somewhat arbitrary, and you can use different pins if you'd like. You can read about the reasoning behind the WiringPi convention here.

Step 8: Test it!

Plug in three different appliances to your wireless outlet adapters. Make sure you are in range of the remote (check the original packaging or instruction manual).

Before you start, you need to initialize the GPIO pins as outputs. At the command prompt in a terminal, enter

and start issuing commands! Make sure your spoken commands exactly match the ones you put in the config file. Not working as expected? Head over to the next step for some troubleshooting tips.

Challenge to Linux gurus (I'm a complete amateur): put the GPIO initializations and voicecommand -c into a shell script so you can run a single command to initialize everything. Don't hesitate to leave a helpful comment.

Step 9: Troubleshooting

Something not working? Here are some troubleshooting steps you can try, roughly in order:

Make sure your wireless remote and outlet adapters are working on their own, independent of the Raspberry Pi. Completely unplug the remote from your Raspberry Pi circuit, make sure the battery is in, and make sure you can turn lights on and off just by pushing buttons on the remote. If that works, at least you know your remote isn't broken.

Skip Voice Command and try turning your GPIO pins on and off directly from the command prompt (e.g. just type gpio write 0 1, then remember to type gpio write 0 0 to set the pin LOW again). You should hear a very audible "click" when the relays switch positions. Try this individually for each of the six GPIO pins and corresponding relays.

If you don't hear the relays click at all, double check your breadboard wiring relative to the circuit diagrams. One misplaced wire can mess everything up. If you have a multimeter available, this would be a great time to use it - make sure you are actually getting 3.3V at the outputs of the GPIO pins, and 5V at the outputs of the relays.

If you're having trouble with Voice Command, there are several things you can try, such as adjusting the threshold in the config file, or the amount of time the program will listen for commands (e.g. it might cut you off if your command phrases are too long). The speech recognition isn't perfect, so try enunciating your speech very clearly, or new command phrases that might be easier to recognize. For example, sometimes my program would record "lights off" when I said "light off", and the command wouldn't work.

It should be fine. The wireless outlets are designed to control anything you would normally plug into an outlet. None of the high-voltage AC is actually going through the Raspberry Pi circuit itself. If you are plugging a TON of stuff into a power strip and you are really concerned about the rating of the wireless adapters, you'd have to look up the specs (I don't see them on the product page):

If you're referring to the red and black ones at the very top - correct, those are m/m wires used to connect the power and ground buses on opposite sides of the breadboard. The m/f wires are connected to the GPIO pins on the Pi.

I'm not quite sure what you're asking. The Raspberry Pi is a type of tiny computer, and this project requires a Raspberry Pi. You do not need a "regular" computer (PC or Mac) to do the project though. Is that what you meant?

In first place, I would like to congratulate you for such an excellent instructable!! :)

I'm thinking to make a wired version of this instead of using remote. So I am thinking to use external relays connected to AC power and lights. Then control the external relays by the existing relays. Would that work?

Also please let me know which mic can I use as a substitute to your webcam. I need to design the project in less cost.

Note: I'm a beginner. I have not used Raspberry pi till now. This would be my first project.

The problem with that one is that it's very expensive - $30 (USD) to control just one outlet. I'm sure SparkFun's shipping to India isn't cheap either, so I'd recommend looking for something similar from an Indian supplier (I'm not really familiar with electronics vendors over there).

The good thing about it is that it safely contains the high voltage wiring so you do not have to touch it at all, beyond just plugging in an appliance like you would normally. You just handle the logic-level wiring to your microcontroller like you would with any other Arduino or Raspberry Pi project, which is perfectly safe. If you are a beginner, you should NOT wire relays up to high-voltage AC yourself. It is dangerous and can kill you or burn your house down if you do not know what you are doing.

Ah, OK. Sometimes complete beginners think they can dive right into high-voltage wiring and of course that is not safe.

I forgot to mention - most USB webcams or mics should be compatible with the Raspberry Pi. My webcam was just plug-and-play, I didn't have to install any drivers. If you are going to buy something, I would just do a quick Google search first to see if you can find anything about compatibility with the Raspberry Pi, or if you need to install certain Linux drivers to get it to work.

I am having trouble I have build everything and also edited the file with the code. But when I am putting the command of gpio write 0 1 it says not found and I have checked all my wires 5 times. Please help

Can you type the EXACT error message that you get? The GPIO pins can be set high or low even if there is nothing attached to them, so I doubt this is a wiring issue, it is probably a software issue. I wrote this Instructable 8 months ago so I cannot promise that nothing has changed with either the WiringPi or VoiceCommand software, that might make this out of date.

I reinstalled wiringPi the code is working now but I dont here realay clicking sound. I have seen in the instructions image its all same but I have noticed that, the pic you have put with the diagram has different wiring. I can follow the pic but I am un sure which wire is going in which spot which is hidden behind the relay so can u put the other side pic too so I can see the pic and follow it.

Unfortunately I actually disassembled this project a while ago so can't take new pictures. If you tell me exactly which wires you think are wrong in the diagrams (refer to the color, give breadboard row/column info, be as specific as possible) I can check to see if I made an error.

Hmm. As far as I can tell from the photos your wiring looks right. This is difficult to help solve over the internet, but next I would try troubleshooting individual things to try isolating the problem:

1. Make sure your Raspberry Pi's GPIO pins work. If you have LEDs, you can just use your code to drive LEDs instead of the same circuit. If you have a multimeter, you can measure the output voltage of each pin.

2. Make sure the relays work by applying 5V directly across the coil from the power and ground buses, instead of using the Pi's GPIO pins and the MOSFET. For example, for the first relay - remove the MOSFET, then use a jumper wire to connect hole J7 to the ground bus. This should apply 5V directly across the coil (since hole A7 is connected to +5V) and you should hear a click.

3. For the MOSFETs - did you order the exact part I recommended from SparkFun, or something else?

If you're 100% sure you connected everything correctly and the relays are not working, I'd contact the supplier (SparkFun?) for a refund and see if you can get new parts. But, I would double and triple check that you are properly applying 5V across the relay coil (the two pins that are directly across from each other, not the three pins that sort of form a triangle - look at the relay's datasheet if that helps) before you tell them that they're broken.

Ah, OK - that shouldn't matter because the ground buses run the entire length of the breadboard (the "buses" are the two long strips on each side, one with a red line and one with a black line, for power and ground respectively). You should be able to plug a wire anywhere into the bus and it won't make a difference. However, I found out recently that some of these breadboards have the buses broken into halves, somewhere around row 30. This could be the case with your breadboard. If you have extra jumper wires, try using them to connect the "top half" of your breadboard's ground bus (somewhere in rows 1-30) to the "bottom half" (rows 31-60), and see if that solves your problem.

Also, if you have a multimeter with a "continuity test" mode, you could use that to confirm whether the entire ground bus is connected, or if it is broken in half.

you were right that bus was split in every 30 places and I have connected them but still no luck to make it work. I have tested there is power in breadboard. I have attached some pic of my work in different angles so u can see the wiring.