/arduino-rtlsdr

Software-defined radio with Arduino 433 MHz transmitter and RTL-SDR receiver

Primary LanguageJupyter Notebook

Software-defined radio with Arduino 433 MHz transmitter and RTL-SDR receiver

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.

Requirements

I used the following hardware and software for the project.

Hardware

Software

Reverse-engineering

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.

Real-time receiver

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.