Overview #
NORVI X is a next generation modular industrial controller designed to power smart automation and IoT solutions. Built around a CPU module and a range of plug and play expansion modules, the platform scales from a handful of I/O points up to 200, giving system integrators, OEMs, and industrial engineers a flexible foundation for automation, remote monitoring, and data acquisition projects.
The NORVI X-Q16 is a 16-channel transistor output expansion module designed for the NORVI X modular controller platform. It provides sixteen high-side switching outputs for controlling DC loads such as industrial actuators, relays, solenoids, and indicator devices.
The Q16 uses P-channel MOSFET high-side switches with optocoupler isolation. Each output includes integrated fuse and surge protection, while individual LEDs provide output status indication.
This guide covers installation, wiring, technical specifications, terminal and address configuration, software setup, diagnostic test code, and troubleshooting.
Key Features #
- 16 high-side transistor output channels using P-channel MOSFETs
- Up to 24 V DC switching
- Full optical isolation with dual opto-isolation per channel
- Per-channel resettable PTC fuse and surge protection
- Individual LED status indicators per output
- DIN rail mountable enclosure with push-in front terminals
- CE / EMC compliant
Safety Information #
- Install and wire this module only if you are a qualified electrician or trained technician familiar with industrial control equipment.
- Confirm the host CPU is running from a regulated 24 V DC supply.
- Do not connect or disconnect the expansion module while the system is powered.
- Ensure that the supply voltage does not exceed 24 V DC.
- Do not exceed 0.5 A on any individual transistor output.
- Do not exceed a total supply current of 8 A.
- Mount the module on a DIN rail inside a suitably rated enclosure. It carries an IP20 protection rating and is not designed for direct outdoor or wash down exposure.
- Keep the operating environment within minus 40 to plus 85 degrees C and avoid condensing humidity.
- Follow all local and national electrical codes applicable to industrial control panel wiring.
Technical Specifications #
Electrical #
| Rated Supply Voltage | 24V DC |
| Current Consumption | 90mA @ 24V DC |
Output Specifications #
| Number of Outputs | 16 Transistor Output channels |
| Transistor Output Current | 0.5A per channel |
| Switching Transistor | P-Channel MOSFET |
| Maximum Supply Voltage | 24V DC |
| Maximum Supply Current | 8A |
| Output Type | High-Side Switch |
| Isolation Type | Optocoupler Isolation |
| Protection (Per Channel) | Per-channel resettable PTC fuse |
| Output Diagnostics | Individual LED indicators |
| Connector Type | Spring terminal |
Hardware Layout & GPIO Map #
The Q16 communicates with the NORVI X CPU through the expansion bus. The transistor output channels are provided through the field terminal block as TR1 through TR16.
| Terminal | Function |
|---|---|
| TR1 | Transistor Output 1 |
| TR2 | Transistor Output 2 |
| TR3 | Transistor Output 3 |
| TR4 | Transistor Output 4 |
| TR5 | Transistor Output 5 |
| TR6 | Transistor Output 6 |
| TR7 | Transistor Output 7 |
| TR8 | Transistor Output 8 |
| TR9 | Transistor Output 9 |
| TR10 | Transistor Output 10 |
| TR11 | Transistor Output 11 |
| TR12 | Transistor Output 12 |
| TR13 | Transistor Output 13 |
| TR14 | Transistor Output 14 |
| TR15 | Transistor Output 15 |
| TR16 | Transistor Output 16 |
| GND | Ground |
I2C Address Selection #
The PCA9539 that directly drives the 16 transistor channels is addressed at 0x75. The DIP-selectable addresses from 0x27 to 0x20 apply when the module is daisy-chained with other I2C-addressed NORVI expansion modules on the same bus.

| Address Selection | ||||
|---|---|---|---|---|
| DIP 1 | DIP 2 | DIP 3 | DIP 4 | Address |
| OFF | OFF | OFF | × | 0x27 |
| ON | OFF | OFF | × | 0x26 |
| OFF | ON | OFF | × | 0x25 |
| ON | ON | OFF | × | 0x24 |
| OFF | OFF | ON | × | 0x23 |
| ON | OFF | ON | × | 0x22 |
| OFF | ON | ON | × | 0x21 |
| ON | ON | ON | × | 0x20 |
Wiring Guide #
GPIO pin assignments for the module are listed in the Hardware Layout and GPIO Map section. This section covers how to physically wire the X-Q16.
Power Connection #
The module draws its internal 24 V DC supply through the expansion port shared with the CPU. A separate power terminal is also provided on the X-Q16 for supplying the transistor output loads.
Transistor Output Wiring #
- Each output channel switches through an internal opto-isolated MOSFET between its TRx terminal and the POWER block’s 24V rail.
- Connect one lead of the load, such as a relay coil, solenoid, actuator, or indicator, to the corresponding TRx terminal. Connect the other lead of the load to GND.
- The module’s outputs are powered from the dedicated POWER terminal block containing 24V, 24V, GND, GND, and GND terminals.
- Wire an external 24 V DC supply to a POWER 24V terminal and its return to a POWER GND terminal before wiring any loads.
- When a channel is switched ON, its TRx terminal is internally connected to the POWER block’s 24 V rail, sourcing 24 V DC to the load.
- When a channel is OFF, its TRx terminal is left floating at high impedance.
- The output block GND terminal and the POWER block GND terminals share a common ground reference.
- Since all sixteen outputs share the same POWER supply and GND reference, use consistent wiring across all sixteen channels.
- For inductive loads such as relay coils or solenoids, keep the load within the per-channel fuse and switching limits.

Connecting the Module to the CPU #
- Power off the system.
- Mount the X-Q16 on the DIN rail next to the CPU module or an adjacent expansion module.
- Seat it firmly onto the expansion bus connector until it locks into place.
- If daisy-chaining multiple I2C-addressable modules, set the DIP switches first so each module has a unique address.
- Wire your loads to TR1 through TR16, confirming each stays within the 0.5 A per-channel and 24 V DC rating.
- Power the system back on.
- Upload the module’s test sketch from the NORVI GitHub repository to confirm each channel operates correctly.

Expansion Port (50 pin) #
The X-Q16 connects to the CPU through the shared 50 pin expansion bus. The pins used by the module include SCL, SDA, GND, 24V, and 5V. The remaining pins pass through for other expansion modules.
| PIN INDEX | Purpose | GPIO | SOURCE |
|---|---|---|---|
| 1 | MOSI | IO11 | ESP32-S3 |
| 2 | MISO | IO13 | |
| 3 | SCLK | IO12 | |
| 4 | GND | —- | |
| 5 | SCL | IO9 | |
| 6 | SDA | IO8 | |
| 7 | GND | —- | |
| 8 | RX1 | IO18 | |
| 9 | TX1 | IO17 | |
| 10 | GND | —- | |
| 11 | D+ | —- | |
| 12 | D- | —- | |
| 13 | GND | —- | |
| 14 | CS1 | P1_0 | PCA9539 I2C Address 0x75 |
| 15 | CS2 | P0_7 | |
| 16 | CS3 | P0_6 | |
| 17 | CS4 | P0_5 | |
| 18 | IO1 | IO1 | ESP32-S3 |
| 19 | IO2 | IO2 | |
| 20 | IO4 | IO4 | |
| 21 | IO5 | IO5 | |
| 22 | IO6 | IO6 | |
| 23 | IO7 | IO7 | |
| 24 | IO10 | IO10 | |
| 25 | IO11 | IO35 | |
| 26 | IO12 | IO41 | |
| 27 | IO13 | IO37 | |
| 28 | IO14 | IO14 | |
| 29 | RS485_TX | IO15 | |
| 30 | GND | —- | |
| 31 | GND | —- | |
| 32 | RS485_RX | IO16 | |
| 33 | P1_1 | P1_1 | PCA9539 I2C Address 0x75 |
| 34 | P1_2 | P1_2 | |
| 35 | IO21 | IO21 | ESP32-S3 |
| 36 | GND | —- | |
| 37 | GND | —- | |
| 38 | P1_3 | P1_3 | PCA9539 I2C Address 0x75 |
| 39 | P1_4 | P1_4 | |
| 40 | P1_5 | P1_5 | |
| 41 | IO39 | IO39 | ESP32-S3 |
| 42 | IO40 | IO40 | |
| 43 | NC | —- | |
| 44 | NC | —- | |
| 45 | NC | —- | |
| 46 | GND | —- | |
| 47 | 5V | 5V | |
| 48 | GND | GND | |
| 49 | 24V | 24V | |
| 50 | 24V | 24V |
Software Setup (Arduino IDE) #
The NORVI X-Q16 is driven through the host CPU using the Arduino IDE with the ESP32 board package. Firmware examples and required libraries are maintained in the NORVI GitHub repository.
Board Configuration #
-
Install Arduino IDE
Install the Arduino IDE and add ESP32 board support:
Tools → Board → Boards Manager → ESP32 -
Connect the Controller
Connect the NORVI X CPU to your computer using the USB interface.
-
Select Board and Port
Configure the board and communication port:
Tools → Board → ESP32 Arduino → ESP32S3 Dev ModuleTools → Port → Select the corresponding COM/serial port

Configure Board Settings #
Under the Tools menu, configure the following settings:

| Setting | Selection |
|---|---|
| USB CDC On Boot | Enabled |
| Flash Size | 16MB (128Mb) |
| PSRAM | QSPI PSRAM |
Test Code Examples #
Required Libraries #
Install these via Arduino IDE → Sketch → Include Library → Manage Libraries before compiling any of the examples:
- Wire
- SPI
- PCA9539
- PCA9536D
- TFT_eSPI
- CST816S
- RTClib
- WiFi
- Ethernet
- EthernetUDP
- SD
Install the Required Library #
Install the Wire library through:
Search for Wire and install it if required.

Open and Upload the Test Sketch #
- Open the X-Q16 test sketch from the NORVI GitHub repository .
- Verify the board and port selections.
- Click Upload to upload the test sketch to the NORVI X CPU.
Initialization #
The test sketch starts Serial communication at 115200 baud, initializes the I2C bus using SDA on IO8 and SCL on IO9, scans the I2C bus, and initializes the CPU-side PCA9539 interface at address 0x75.
#include <Wire.h>
#include "PCA9539.h"
#define SDA 8
#define SCL 9
PCA9539 ioport(0x75);The sketch then configures the required output channels as outputs and controls the output states during the test.
Transistor Output Test #
The test routine first switches the output channels OFF and then switches them ON one after another, with short delays between channels. This allows the operator to observe the corresponding output LED and connected load.
// Turn off outputs
digitalWrite(OUTPUT5, LOW);
digitalWrite(OUTPUT6, LOW);
// ...
// Turn on outputs sequentially
digitalWrite(OUTPUT5, HIGH);
delay(100);
digitalWrite(OUTPUT6, HIGH);
delay(100);
// ...Validating the Full Test Sketch #
Open the Serial Monitor at 115200 baud and confirm that the I2C scan detects the expected devices.
Observe the Q16 output LEDs while the test routine is running and verify that each connected load responds correctly when its corresponding output is activated.
After testing, confirm that all outputs return to their intended safe state. Do not connect loads that exceed the specified per-channel or total current limits.
Troubleshooting #
| Symptom | Suggested Action |
|---|---|
| Output stays off | Check wiring polarity and confirm GND is properly connected to the load’s return path. |
| LED stays off despite command | Confirm I2C communication with the PCA9539 at 0x75 is succeeding. Check SDA/SCL wiring and pull-ups. |
| Output stays on / won’t turn off | Check for a shorted or overloaded channel that may have tripped the PTC fuse. Power-cycle to reset. |
| Module not detected by the CPU | Power down, reseat the module on the expansion bus, and confirm there is no address conflict with other daisy-chained modules. |
| Inconsistent switching on multiple modules | Confirm each daisy-chained module has a unique I2C address according to the DIP switch table. |
| TFT display blank or not working | Check three settings under Tools: USB CDC On Boot set to Enabled, Flash Size set to 16MB (128Mb), and PSRAM set to QSPI PSRAM. |