Project overview: I will demonstrate how to open certain styles of garage doors using a Yard Stick One transmitter.

Dip switch style garage openers

Early styles of garage doors used dip switch remotes that operate between the 300-400 MHz frequency range. The radio frequency (RF) signal transmitted by these remotes depend on the configuration of their internal dip switches. If the correct signal is sent the garage door will open.

Dip switch remotes usually have 8-12 dip switches. Each dip switch can be in one of two states: high or low. The number of unique signals a dip switch remote can transmit is equal to 2x , where x = the number of dip switches. This means that all garage doors that use dip switch remotes can be opened by brute force.


Garage remote with its dip switches exposed


Enlarged view of the dip switches - all 10 dip switches are in a 'high' state

Capturing and analyzing signals

NooElec's R820T Mini is a low cost antenna that's able to receive low frequency RF signals, including those transmitted by dip switch remotes.


NooElec R820T Mini: USB interface and antenna

RF signals can be visualized on a computer using software defined radio (SDR). One such SDR is gqrx. When paired with NooElec's R820T Mini, signals coming from a dip switch remote can be captured and recorded.


gqrx GUI

Captured RF signals in gqrx come in the form of WAV files which can be viewed using Audacity. Below are 3 signals from the 10 dip switch remote pictured above. Each of the 3 signals have a different dip switch configuration.


Garage remote signal: all 10 dip switches in a 'high' state


Garage remote signal: first 5 dip switches in a 'high' state, last 5 dip switches in a 'low' state


Garage remote signal: all 10 dip switches in a 'low' state

A pattern becomes evident when the signals are closely observed. When a dip switch is in a 'high' state, there is a long peak followed by a short valley. When a dip switch is in a 'low' state, there is a short peak followed by a long valley.


3 signals superimposed and divided by dip switch

Recreating signals

The Yard Stick One is a radio transmitter that's able to transmit signals in the 300-400 MHz range, the same frequency that dip switch garage remotes operate.


Yard Stick One transmitter

Dip switch remotes have a fixed number of unique signals (that is, codes) they can produce. In the case of a 10 dip switch remote there are a total of 1024 unique signals it can transmit (210). This can be achieved with the Yard Stick One and the RfCat Python library (note: RfCat is written in Python 2).

Creating signals with the Yard Stick One is pretty straightforward. First an RfCat object is created in Python and the transmitted signals' frequency, modulation, and baud rate are set:

from rflib import *

d = RfCat()
d.setFreq(300000000) # 300 MHz
d.setMdmModulation(MOD_ASK_OOK)
d.setMdmDRate(4800)


Signals are transmitted using the RFxmit function, which takes binary 1's and 0's as input. From the results above, a dip switch in a 'high' position is a long peak followed by a short valley and a dip switch in a 'low' position is a short peak followed by a long valley. For a long peak or valley, we can transmit three consecutive 1's or 0's via RFxmit. For a short peak or valley, we can transmit a single 1 or 0. Thus:

A dip switch in a 'high' position corresponds to RFxmit("1110"):



A dip switch in a 'low' position corresponds to RFxmit("1000"):



For a signal where the first 5 dip switches are 'high' and the last 5 dip switches are 'low', the input would be:

1110  1110  1110  1110  1110  1000  1000  1000  1000  1000

The binary 1's and 0's can be put in to groups of 8 and then converted to hexadecimal:

EE  EE  E8  88  88

To transmit this signal in RfCat the syntax would be: RFxmit("/xEE/xEE/xE8/x88/x88")


Signals with the first 5 dip switches 'high' and the last 5 dip switches 'low'

In order to brute force a garage door you will need to transmit all the possible dip switch combinations one by one until the correct signal is sent. A brute force script for a 10 dip switch remote can be found here on my Github.