This repository contains helpful resources to receive signals transmitted from an Arduino 433 MHz transmitter with an RTL-SDR receiver using GNU Radio.
The project consists of two parts. In the first part, we reverse-engineer the protocol. In the second part, we implement a real-time receiver.
I used the following hardware and software for the project.
- Arduino Uno
- Arduino 433 MHz transmitter
- RTL-SDR v3
- ANT500 Antenna
- GNU Radio
- Inspectrum (for reverse-engineering the dodulation scheme)
- CubicSDR (for frequency search)
Our first step in our endeavor is to understand the protocol used by the transmitter.
For consumer equipment, the FCC code can be used to find a technical document through the Electronic Authorization Search of the FCC that describes the exact frequency characteristics and modulation protocol. Unfortunately, I was not able to find any FCC code for the Arduino transmitter. Hence, we need to reverse-engineer the protocol by hand.
For reverse-engineering we recorded the raw I/Q samples from the command line via rtl_sdr
and evaluated the I/Q samples for different transmission configurations in the notebooks.
It appears that the transmitter transmits the same signal ten times. The transmitter decodes the information using on-off-shift keying (OOK). The zero-bit symbol is decoded as a small rectangular pulse while the one-bit symbol is decoded as a long rectangular pulse.
For the real-time receiver, we defined a GNU Radio flowgraph that extracts the digital signal in real-time from the RTL-SDR.
We implemented an embedded python block in GNU Radio that can decode the digital signal. We found that on my computer (MacBook Pro 2018), the decoding is too slow for real-time. As an alternative, I send the digital signal through ZeroMQ to a nodejs process that outputs the value to stdout.