A custom IR communication protocol inspired by NEC, featuring parallel dual-channel transmission using a PYNQ-Z2 FPGA and dual Arduino Uno receivers.
- Overview
- Hardware Setup
- Software Setup
- Running the Project
- Protocol Specification
- Modifying the PL Design
- Troubleshooting
This project implements a custom IR communication standard across two components:
| Component | Role |
|---|---|
| PYNQ-Z2 FPGA (PS + PL) | IR Transmitter β sends signals via AR0 and AR1 pins in parallel |
| Arduino Uno Γ 2 | IR Receivers β decode and display received signals over Serial |
- PYNQ-Z2 FPGA board Γ 1
- Arduino Uno Γ 2
- IR transmitter Γ 2 (connected to FPGA)
- IR receiver Γ 2 (one per Arduino)
- Jumper wires
β οΈ Important: Place a physical barrier between the two IR transmitters to prevent signal interference.
| IR Transmitter 1 | PYNQ-Z2 Pin |
|---|---|
| Data | AR0 |
| VCC | VCC |
| GND | GND |
| IR Transmitter 2 | PYNQ-Z2 Pin |
|---|---|
| Data | AR1 |
| VCC | VCC |
| GND | GND |
| IR Receiver 1 | Arduino Pin |
|---|---|
| Data | Pin 11 |
| VCC | 5V |
| GND | GND |
| IR Receiver 2 | Arduino Pin |
|---|---|
| Data | Pin 11 |
| VCC | 5V |
| GND | GND |
Click to expand wiring photos
Own_IR_Standard/
βββ PS part/
β βββ nec_onlyFPGA.ipynb # Jupyter notebook for PYNQ-Z2
βββ PL part/ # Vivado hardware design files
βββ arduino part/
β βββ IR_TransmitterReceiver/
β βββ IR_TransmitterReceiver.ino
βββ xilinx/overlays/own/
βββ design_1_wrapper.bit # FPGA bitstream
βββ design_1_wrapper.hwh # Hardware handoff file
- Arduino: Arduino-IRremote
Connect the PYNQ-Z2 to your computer using:
- Micro-USB cable (power/programming)
- Ethernet cable (network access)
For first-time setup, configure the IP address by following:
- πΊ Video Guide
- π Written Tutorial
Open your browser and navigate to:
http://192.168.2.99:9090/
π Default password:
xilinx
| File | Destination on Server |
|---|---|
nec_onlyFPGA.ipynb |
Your project folder |
design_1_wrapper.bit |
xilinx/overlays/own/ |
design_1_wrapper.hwh |
xilinx/overlays/own/ |
- Open
IR_TransmitterReceiver.inoin the Arduino IDE - Upload the sketch to both Arduino boards
- Open
nec_onlyFPGA.ipynbon the PYNQ-Z2 Jupyter server - Modify
cmd0_strandcmd1_strvariables to set the messages you want to transmit - Run all cells in the notebook
What happens:
- The FPGA transmits IR signals simultaneously via AR0 (Transmitter 1) and AR1 (Transmitter 2)
- Each Arduino receives its respective IR signal on Pin 11
- Decoded values are printed in each Arduino's Serial Monitor at baud rate
9600
This protocol is custom-designed and inspired by the NEC IR standard, with the following differences:
| Feature | NEC Standard | OWN Standard |
|---|---|---|
| Total bits | 32 bits | 10 bits |
| Address bits | 8 bits | 5 bits |
| Command bits | 8 bits | 5 bits |
| Parallel channels | 2 | 2 (concurrent) β¨ |
π§ Parallel own transmission (dual-channel) is currently still in progress.
To modify the hardware design in Vivado:
- Vivado 2020.2 β Download from Xilinx Archive
- PYNQ-Z2 Board Files β Install from this repository
| Folder | Description |
|---|---|
PS part/ |
PYNQ-Z2 server-side code (Processing System) |
PL part/ |
IP cores and hardware design (Programmable Logic) |
arduino part/ |
Arduino code for testing and debugging |
| Symptom | Possible Cause | Solution |
|---|---|---|
| No IR signal received | Receiver not powered | Check that the LED on the IR receiver is lit |
| Garbled / corrupted data | Baud rate mismatch | Ensure both ends use baud rate 9600 |
| FPGA not responding | Board still booting | Wait 1β2 minutes after powering on |
| Arduino not detected | Connection issue | Check USB cables and verify the correct COM port is selected |
| Signal interference between channels | No barrier between transmitters | Place a physical divider between the two IR transmitters |





