Thursday, August 4, 2011

Open garage door via cell phone bluetooth connection.

Pseudo Purpose:
I can't remember where I read about the idea, but it was while searching the web for stuff to do.  The over all idea I went for was to connect my cell phone with a bluetooth device that will trigger my garage door to open or close on command.  I chose bluetooth instead of through the web or wifi as I didn't want to accidentally leave my garage door open all day and if it were to be hacked it would have to be done a decent range of my house and not from someone half way around the globe.  Why not just use the garage door opener?  Well I have more than one car and just one remote and rarely do I not have my cell phone on me.  Opening the garage door with my cell phone is easier than reaching into my daily driver and remembering to put the remote back before heading to work the next day.  You can see it work on my YouTube video.

Parts:
Arduino Uno - Any micro controller will do, I started with arduino and the code below is purposefully for the Uno board, since that's what I had from other projects.
BlueSMiRF  - The bluetooth antenna of my choosing.  Namely because it was the cheaper of available options at around $40.  I'll probably go with the gold instead of silver version in the future to get more range out of the wireless connection.  An Xbee or Bluetooth Mate antenna would work as well.
2N2222 Transistor - Simply, there are 3 leads on this part and when electricity is sent down the middle lead it will bridge an electrical connection through the two outside leads.
Garage Door Remote - This can be the wall mounted internal remote or the remote for your car.  I chose my car remote as it seemed easier to open the case.
Amarino app on Android phone - The Amarino app is designed to manage multiple bluetooth devices from your phone that can accept serial commands.  It also has a library for simplifying the Arduino code needed to receive and respond to your cell phone.  Amarino install instructions were fairly clear for me from their website.


Code:
I'm going to skip a bit of Arduino basics since it's covered so well on there website.  Specifically with how to install their software, edit code, add a software library, and upload the code to your Arduino Uno.  From the Amarino website. you'll need to follow the instructions for downloading and adding the MeetAndroid library found here. Once the library is added you should be able to copy the following code and upload it without editing.

#include <MeetAndroid.h>

MeetAndroid meetAndroid; // Declare MeetAndroid so that you can call
    // functions with android devices over bluetooth.

int GaragePin = 9;   // We need a pin to initiate the garage door

void setup() 
{
     
  Serial.begin(57600); // Use the baud rate your bluetooth module is configured to use.
 
  meetAndroid.registerFunction(Garage, 'A'); // Register callback functions,
    // which will be called when an associated event occurs.
    // These match the "FLAG" used from Amarino

  pinMode(GaragePin, OUTPUT);  // set garage pin as output

}

void loop()
{
  meetAndroid.receive(); // you need to keep this in your loop() to receive events
}


void Garage(byte flag, byte numOfValues) // Defining the function we registered above.
{
if (meetAndroid.getInt() == 999) {     // replace 999 with any 1 to 5 digit code to keep
    // the bluetooth door opener some what secure.  This will be the number you type on your
    // phone from the Amarino app to open/close the door.

  analogWrite(GaragePin, 153); // Probably overly cautious, but on a scale of 0 to 255 with
    // 0 volts being 0 volts and 255 being 5 volts I set the analog pin to 153 to
    // roughly simulate 3 volts since that the battery in my garage door remote is a 3V battery and
    // I didn't know or wanted to find out that 5v was too much for the circuit.

  delay(0750); // simulate pushing the tactical button for 3/4 of a sec.

  analogWrite(GaragePin, 0); // simulate releasing the button
  }
}



Assembly:
First I setup and ran a test with the bluetooth connection using one of the MeetAndroid examples that came with the library.  In fact the code above is a modified version of the multicolor led example.
I followed this tutorial for the test. Take Note: There is an RTS and CTS pin on the antenna that need to be wired together and I didn't see this mentioned on the link, which can provide hours of stress and self-doubt when you follow the tutorial step by step and it doesn't work.  Once complete leave the wring in place and begin to hack into the garage door remote.

Usually there is a small indentation or gap not easily visible around the seam of the case.  You should be able to slowly and firmly twist a flat head screw driver without breaking the case.  If you want a visual reference search for how to change the battery in your specific brand of garage door remote.  Now that it's open, identify which side of the button is positive and negative.  There's 4 leads only 2 will be connected by either a trace in the PCB board linked to it or a resistor soldered directly to a lead.  I jammed two jumper wires under the active leads on the button and connected the button's positive lead to the collector pin on the transistor and the button's negative lead to the transistor's emitter pin.  The transistor's base pin is linked through a 10k resistor to pin 9 on the arduino board.  Depending to the transistor you're using you'll need to look up the datasheet of that model to know the pin place and which size resistor to use on the base pin.

And that should do it.

Alternatives:

1. It may have been faster to test that the transistor was working by having it light an led when active then just connect it to the push button and reverse the leads if it didn't work.  May have saved time and eye strain from tracing the PCB lines to find positive and negative leads on the button.
2. Research Arduino code for detecting if the bluetooth antenna has a successful connection.  If I can change the standard authentication so not just anyone could connect than I could have Arduino just check for an active connection.  When found open the door and drop the connection.  This would mean no app needed for the phone, just an attempt to connect to the device will open or close the door.
3. I have a Parallax ultrasonic range sensor.  Might be neat to have the door close automatically when the vehicle reached 6 inches from the back wall or use the sensor to close the door if the garage is left open for more than 10 min.
4. Swap bluetooth for http for connection to arduino, because your spouse or child calls you locked out of the house.