A custom IR communication protocol inspired by NEC (currently based on a simplified NEC implementation), featuring parallel 24-channel transmission using a PYNQ-Z2 FPGA and dual Arduino Uno receivers for testing.
- 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 main 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 Γ 24 (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.(I used a copper Sheet)
| IR Transmitter | PYNQ-Z2 Pin |
|---|---|
| Data (Transmitter 1) | AR0 |
| Data (Transmitter 2) | AR1 |
| ... (and so on for all 24) | AR0 to AR13, A0 to A5, PMODA[0-4] |
| VCC (all) | VCC |
| GND (all) | GND |
| IR Receiver 1 | Arduino Pin |
|---|---|
| Data | Pin 11 |
| VCC | 5V |
| GND | GND |
| IR Receiver 2 | Arduino Pin |
|---|---|
| Data | Pin 10 |
| 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
β βββ IR_research.docx # System description document
βββ arduino part/
β βββ IR_TransmitterReceiver/
β β βββ IR_TransmitterReceiver.ino
β βββ IR_Receiver2/
β βββ IR_Receiver2.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 (Arduino 1) and Pin 10 (Arduino 2)
- 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 | 1 | 2 (concurrent) β¨ |
π§ Parallel OWN transmission is currently still in progress.
- 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 |





