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-Q8 is an 8-channel transistor output expansion module for the NORVI X modular controller platform. It provides eight high-side switching channels for driving industrial actuators, relays, and solenoids.
Each output is optically isolated and uses a high-side MOSFET switch, with integrated fuse protection for reliable control of DC loads in industrial environments.
The X-Q8 is not a standalone device. It needs to be paired with a NORVI X CPU module, such as the CPU ESPS3 X1, to be programmed and operated.
This guide covers installation, wiring, technical specifications, terminal and address configuration, software setup, test code, diagnostics, and troubleshooting.
Key Features #
- 8 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 for each 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.
- Mount the module on a DIN rail inside a suitably rated enclosure.
- The module has an IP20 protection rating and is not intended for direct outdoor or wash down exposure.
- Keep the operating environment within minus 40 to plus 85 degrees C and avoid condensing humidity.
- Do not exceed 0.5 A per channel or the total 4 to 5 A supply current across all eight channels.
- Do not connect or disconnect the module from the expansion bus while the system is powered.
- Follow all applicable local and national electrical codes.
Technical Specifications #
Electrical #
| Rated Supply Voltage | 24V DC |
| Current Consumption | 90mA @ 24V DC |
Output Specifications #
| Number of Outputs | 8 Transistor Output channels |
| Transistor Output Current | 0.5A per channel |
| Maximum Supply Voltage | 24V DC |
| Maximum Supply Current | 4–5A |
| Output Type | High-Side Switch |
| Switching Transistor | P-Channel MOSFET |
| 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 X-Q8 does not claim direct ESP32-S3 GPIO pins for its output channels. It uses the shared I2C bus together with the module control signals.
| Expansion Port Pin | Purpose | GPIO / Signal | Source |
|---|---|---|---|
| 5 | SCL | IO9 | ESP32-S3 |
| 6 | SDA | IO8 | ESP32-S3 |
| 35 | RESET | IO21 | ESP32-S3 |
Output Terminals #
| 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 |
| GND | Ground |
I2C Address Selection #
The PCA9539 that directly drives the eight transistor channels is addressed at 0x75. The DIP-selectable addresses 0x70 to 0x73 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 | × | × | 0x73 |
| ON | OFF | × | × | 0x72 |
| OFF | ON | × | × | 0x71 |
| ON | ON | × | × | 0x70 |
Wiring Guide #
GPIO pin assignments for every output are listed in the Hardware Layout and GPIO Map section. This section covers the physical wiring of the module.
Power Connection #
The module receives its internal 24 V DC supply through the expansion port shared with the CPU. The X-Q8 also provides a separate POWER terminal block 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 transistor outputs are powered from the dedicated POWER terminal block containing 24V, 24V, GND, GND, and GND terminals.
- Connect an external 24 V DC supply to one of the POWER 24V terminals and its return to a POWER GND terminal before wiring any loads.
- When a channel is ON, its TRx terminal is internally connected to the POWER block’s 24 V rail and sources 24 V DC to the load.
- When a channel is OFF, the 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 eight outputs share the same POWER supply and GND reference, use consistent wiring across all 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-Q8 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 the loads to TR1 through TR8 and confirm that each load remains 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 output channel operates correctly.

Expansion Port (50 pin) #
The X-Q8 connects to the CPU through the shared 50 pin expansion bus. The pins used by this 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 | PCA9538 Reset |
| 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-Q8 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 below:
- Wire
- WiFi
- SPI
- PCA9538
- TFT_eSPI
- CST816S
- Free_Fonts
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-Q8 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.
Transistor Output Drive #
The following setup initializes the PCA9538 and configures the eight transistor output channels.
#include <Wire.h>
#include <PCA9538.h>
#define PCA9538_ADDR 0x73
#define SDA 8
#define SCL 9
#define PCA_RESET 21
#define TR1 1
#define TR2 2
#define TR3 3
#define TR4 4
#define TR5 5
#define TR6 6
#define TR7 7
#define TR8 8
PCA9538 io(PCA9538_ADDR);
void setup() {
pinMode(PCA_RESET, OUTPUT);
digitalWrite(PCA_RESET, HIGH);
Wire.begin(SDA, SCL);
io.pinMode(TR1, OUTPUT);
io.pinMode(TR2, OUTPUT);
io.pinMode(TR3, OUTPUT);
io.pinMode(TR4, OUTPUT);
io.pinMode(TR5, OUTPUT);
io.pinMode(TR6, OUTPUT);
io.pinMode(TR7, OUTPUT);
io.pinMode(TR8, OUTPUT);
}Driving a Channel #
io.digitalWrite(TR1, HIGH);
delay(300);
io.digitalWrite(TR1, LOW);
delay(300);I2C Bus Scan #
Run the I2C scan after wiring and setting the DIP switch address to confirm that the PCA9538 on the X-Q8 is being detected.
void I2C_SCAN() {
byte error, address;
int deviceCount = 0;
Serial.println("Scanning...");
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16)
Serial.print("0");
Serial.print(address, HEX);
Serial.println(" !");
deviceCount++;
delay(1);
}
else if (error == 4) {
Serial.print("Unknown error at address 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
}
}
if (deviceCount == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("Scanning complete\n");
}Validating the Full Test Sketch #
When wired correctly, toggling each channel in the test sketch should energize the corresponding transistor output, light its status LED, and switch the connected load within roughly one loop cycle.
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 the system to reset. |
| Module not detected by the CPU | Power down, reseat the module on the expansion bus, and confirm that 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. |