XStore

NORVI X CPU-ESPS3-X1 – USER GUIDE

Updated on August 20, 2026

11 min read

NORVI X is a next-generation modular industrial controller designed to power smart automation and IoT solutions. Built around a powerful CPU module and a range of plug-and-play expansion modules, the platform scales from a handful of I/O points up to 200 inputs and outputs, giving system integrators, OEMs, and industrial engineers a flexible foundation for automation, remote monitoring, and data acquisition projects.

The NORVI CPU-ESPS3-X1 is the base CPU module in the NORVI X range. It combines an ESP32-S3 processor with a built-in touch display, Ethernet, RS-485, Wi-Fi, and Bluetooth connectivity, and is designed to pair with NORVI X expansion modules to build a complete industrial control system on a DIN rail.

This guide covers everything needed to confidently install, configure, and deploy the module – including safety requirements, hardware specifications, GPIO and wiring references, Arduino IDE setup, diagnostic test code, expansion module integration, supported communication protocols, and troubleshooting.

Key Features #

  • Based on the ESP32-S3-WROOM-1U-N16R2 (16 MB Flash, 512 KB SRAM, 2 MB PSRAM)
  • 2.0″ TFT SPI display (ST7789 driver)
  • Built-in RS-485 communication with an SN65HVD72DGKR half-duplex transceiver and automatic direction control
  • Built-in Ethernet communication
  • Wi-Fi 2.4 GHz and Bluetooth connectivity
  • DS3231 real-time clock (RTC)
  • MicroSD card support (SPI interface)
  • DIN-rail mountable enclosure with pluggable terminals
  • Scales up to 200 I/O points via NORVI X expansion modules
  • CE / EMC compliant (EN 61131-2:2007, EN 61010-1:2010+A1:2019, EN IEC 61010-2-201:2018, 2014/30/EU)

Supported Expansion Modules #

An expansion module from NORVI Controllers must be used to add process I/O to the CPU module. The following expansion module families are currently available:

CategoryExamples
Digital InputX-DI4 (GPIO), X-DI8 / X-DI16 (I²C) – 12–24V DC
Relay OutputX-R4, X-R8 (I²C, 5A relay)
Transistor OutputX-Q4 (GPIO), X-Q8 / X-Q16 (I²C) – 0.5A/ch
Analog InputX-AV4 0–10V (I²C, 16-bit ADC), X-AI4 4–20mA (I²C, 16-bit ADC)
Digital/AC InputX-DA8 (I²C) – 110/230V AC
Analog OutputX-AQ4 0–10V / 4–20mA (I²C)
SensorX-RTD4 (Pt100/Pt1000)
CommsX-UART-IO – RS-485 / RS-232 / UART

Note: When selecting expansion modules, refer to the NORVI X Mixing Guide to ensure the selected modules are compatible.

Safety Information #

Warning: Disconnect all power sources before installing, wiring, or servicing the NORVI CPU-ESPS3-X1. Failure to do so may result in electric shock or damage to the equipment.

  • Install and wire this device only if you are a qualified electrician or trained technician familiar with industrial control equipment.
  • Use a regulated 24 V DC power source rated at least 1 A. Do not exceed the rated supply voltage.
  • Mount the unit on a DIN rail inside a suitably rated enclosure (the module has an IP20 protection rating and is not designed for direct outdoor or wash-down exposure).
  • Keep the operating environment within –40°C to +85°C and avoid condensing humidity.
  • Do not connect or disconnect expansion modules or communication wiring while the system is powered.
  • Ensure adequate spacing around the unit and expansion modules for ventilation and wiring access.
  • Follow all local and national electrical codes applicable to industrial control panel wiring.

Technical Specifications #

Peripherals #

MicroSD Card (SPI) #

InterfaceSPI
CSIO42
MISO / MOSI / SCLKIO13 / IO11 / IO12
Card detectNot connected

Display (ST7789 TFT) #

MISO / MOSI / SCLKIO13 / IO11 / IO12
Display CSIO45
Display resetIO47
Display DCIO46
Touch SCL / SDAIO9 / IO8

RS-485 #

TransceiverSN65HVD72DGKR
ModeHalf-duplex
Unit load1/4
Direction controlAutomatic
TX / RX pinsIO15 / IO16

Hardware Layout & GPIO Map #

The table below lists the GPIO pins reserved for on-board CPU functions. Pins not listed here are broken out to the 50-pin expansion port (Section 6) for use by expansion modules or custom wiring.

GPIOCPU FunctionExpansion Port
0BOOT ButtonNC
1SCSN – EthernetIO1
2RSTN – EthernetIO2
4INTN – EthernetIO4
8SDASDA
9SCLSCL
11MOSIMOSI
12SCLKSCLK
13MISOMISO
15RS485 – TXIO15
16RS485 – RXIO16
19USB – DND_N
20USB – DPD_P
38PCA9536 – RESETRST_PCA
42SD CARD – CSNC
45CS – TFT DISPLAYNC
46DC – TFT DISPLAYNC
47RESET – TFT DISPLAYNC
48INTERRUPT – TOUCH PANELNC

Note: Some of the GPIOs are not available on the N16R8 version; they are supported only on the standard version.

Wiring Guide #

GPIO pin assignments for every signal referenced below are listed once in Section 5 (Hardware Layout & GPIO Map) ; this section covers how to physically connect each interface, not the pin numbers themselves.

Power Connection #

  1. Use a regulated 24 V DC power supply rated at 1 A or higher.
  2. Connect 24 V and GND to the pluggable power terminals as marked on the enclosure.
  3. Double-check polarity before applying power.
Power Input Connections
Power Input Connections

RS-485 #

The RS-485 port uses a 3.3V SN65HVD72DGKR transceiver in half-duplex mode with automatic direction control, so no manual DE/RE handling is required in firmware.

  1. Connect the A and B terminals to the corresponding A/B (or D+/D–) terminals on the RS-485 field device or upstream Modbus RTU master.
  2. Connect a common GND reference between devices where the network spans separate power supplies.
  3. Use a 120 Ω termination resistor at both ends of long RS-485 runs per standard EIA-485 practice.

Note: The on-board SN65HVD72DGKR transceiver operates on 3.3 V logic and uses automatic flow control (hardware-driven direction switching) on this board. Some example sketches (such as the Modbus RTU application guide) instead drive the RS-485 flow-control GPIO manually – HIGH before transmitting, LOW to return to listen mode (see Section 5 for the exact pin) – so check which mode your firmware uses before wiring a multi-drop network.

RS-485 Converter Wiring

Ethernet #

Connect a standard RJ45 Ethernet cable from the module to your network switch or router. The onboard Ethernet controller is dedicated hardware, independent of the Wi-Fi radio, so both interfaces can be used simultaneously if required by your application.

NOEVI X ETHERNET
NORVI X ETHERNET

Connecting an Expansion Module #

Expansion modules (digital input, relay output, analog I/O, etc.) connect to the CPU module via the shared expansion bus or through direct GPIO access, and are wired to field devices at their dedicated terminals. The steps below use the 4-channel Digital Input module (X-DI4) as a worked example – the same pattern applies to other expansion module types.

  1. Power off the system, then mount the expansion module on the DIN rail next to the CPU module and seat it onto the expansion bus connector.
  2. Wire your field signals (e.g. door contacts, limit switches, push buttons) to the module’s INPUT 1-4 terminals. Confirm the signal is within the module’s supported input range (24V DC for the X-DI4).
  3. Power the system back on.
  4. Upload the module’s test sketch to confirm each channel reads correctly on the TFT display or Serial Monitor before wiring it into your final control logic.

Expansion Port (50-pin) #

Expansion modules connect via the 50-pin expansion bus.

PIN INDEXPurposeGPIOSOURCE
1MOSIIO11ESP32-S3
2MISOIO13
3SCLKIO12
4GND
5SCLIO9
6SDAIO8
7GND
8RX1IO18
9TX1IO17
10GND
11D+IO20
12D-IO19
13GND
14CS1P1_0PCA9539
I2C Address 0x75
15CS2P0_7
16CS3P0_6
17CS4P0_5
18IO1IO1ESP32-S3
19IO2IO2
20IO4IO4
21IO5IO5
22IO6IO6
23IO7IO7
24IO10IO10
25IO11IO35
26IO12IO41
27IO13IO37
28IO14IO14
29RS485_TXIO15
30GND
31GND
32RS485_RXIO16
33P1_1P1_1PCA9539
I2C Address 0x75
34P1_2P1_2
35IO21IO21ESP32-S3
36GND
37GND
38P1_3P1_3PCA9539
I2C Address 0x75
39P1_4P1_4
40P1_5P1_5
41IO39IO39ESP32-S3
42IO40IO40
43NC
44NC
45NC
46GND
475V5V
48GNDGND
4924V24V
5024V24V

Software Setup (Arduino IDE) #

The NORVI CPU-ESPS3-X1 is programmed using the Arduino IDE with the ESP32 board package. Firmware examples and required libraries are maintained in the NORVI GitHub repository.

Board Configuration #

  • Board: ESP32S3 Dev Module
  • Recommended Arduino IDE version: 1.8.19

Setup Steps #

1. Install the Arduino IDE and add ESP32 board support via Tools → Board → Boards Manager.

2. Connect the NORVI CPU ESPS3-X1 to your computer via the USB interface.

3. Under Tools → Board, select ESP32S3 Dev Module, and under Tools → Port, select the corresponding COM/serial port.

Arduino IDE Board and Tools Menu Configuration

4. Configure the required settings under the Tools menu according to your setup. Refer to the Board Settings Configuration section for the complete list of recommended settings.

5. Under Tools → USB CDC On Boot, select Enabled, under Tools → Flash Size, select 16MB (128Mb), and under Tools → PSRAM, select QSPI PSRAM.

Upload Setting Under the Tools Menu
Upload Setting Under the Tools Menu
SettingValue
BoardESP32S3 Dev Module
Upload Speed115200
USB ModeHardware CDC and JTAG
USB CDC On BootEnabled
USB Firmware MSC On BootDisabled
USB DFU On BootDisabled
Upload ModeUART0 / Hardware CDC
CPU Frequency240MHz (WiFi)
Flash ModeQIO 80MHz
Flash Size16MB (128Mb)
Partition SchemeDefault 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)
Core Debug LevelNone
PSRAMQSPI PSRAM
Arduino Runs OnCore 1
Events Run OnCore 1
Erase All Flash Before Sketch UploadDisabled
JTAG AdapterDisabled
PortSelect the COM/serial port corresponding to your connected board

6. Install the required libraries via Sketch → Include Library → Manage Libraries, searching for each library named on GitHub.

7. Open the example sketch for your application from the NORVI GitHub repository, verify the board/port selection, and click Upload.

Test Code Examples #

NORVI Controllers publishes an official diagnostic sketch for the NORVI X-CPU-ESPS3-X1 that exercises every on-board peripheral in one run. The excerpts below are taken directly from that sketch and cover the checks most useful for verifying a fresh installation. The full sketch is available in the NORVI-X-Version-02 GitHub repository.

Required Libraries #

Install these via Arduino IDE → Sketch → Include Library → Manage Libraries before compiling any of the examples below:

  • Wire
  • WiFi
  • Ethernet
  • SPI
  • PCA9539
  • PCA9536D
  • RTClib (DS3231 RTC)
  • TFT_eSPI
  • CST816S
Opening the Arduino IDE Library Manager
Opening the Arduino IDE Library Manager

I2C Bus Scan #

Run this first after wiring – it confirms every on-board I²C peripheral is being detected before you test anything else.

Copy
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);  // Wait for a moment to avoid overloading the I2C bus
    }
    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");
  }
}

Expected devices on a CPU module:

0x15CST816S touch controller
0x41PCA9536 I/O expander (buttons PB1/PB3 and status LEDs)
0x68DS3231 real-time clock
0x75PCA9539 base I/O expander

RS-485 Loopback Test #

Connect an RS-485-to-USB converter to the module’s A/B terminals and the USB end to a PC. Open a terminal program with matching baud rate and settings to view the live data exchange and confirm the module’s RS-485 interface is working.

Copy
#define RS485_RXD 16
#define RS485_TXD 15

Serial2.begin(115200, SERIAL_8N1, RS485_RXD, RS485_TXD);

Serial2.println("RS485 01 SUCCESS");

while (Serial2.available()) {
  char c = Serial2.read();
  Serial.write(c);
}

Wi-Fi Access Point Test #

Brings the module up as its own Wi-Fi access point (SSID = the module’s MAC address, password 12345678) – useful for confirming the radio and connecting a phone or laptop for initial commissioning before pointing the device at a production network.

Copy
void wifi_test(){
  Serial.println("");
  String str_macAddress;
  byte mac[6];

  WiFi.macAddress(mac);

   str_macAddress = (String(mac[0] >> 4,  HEX) + String(mac[0] & 0x0F, HEX)) + (":") +
                   (String(mac[1] >> 4,  HEX) + String(mac[1] & 0x0F, HEX)) + (":") +
                   (String(mac[2] >> 4,  HEX) + String(mac[2] & 0x0F, HEX)) + (":") +
                   (String(mac[3] >> 4,  HEX) + String(mac[3] & 0x0F, HEX)) + (":") +
                   (String(mac[4] >> 4,  HEX) + String(mac[4] & 0x0F, HEX)) + (":") +
                   (String(mac[5] >> 4,  HEX) + String(mac[5] & 0x0F, HEX));
  str_macAddress.toUpperCase();
  
  Serial.println("MAC Address: " + str_macAddress);

  String ssid =  str_macAddress; 
  const char* password = "12345678";   

  Serial.println("Setting up the Wi-Fi Access Point...");
  WiFi.softAP(ssid.c_str(), password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("Access Point IP address: ");
  Serial.println(IP);

  Serial.print("Access Point SSID: ");
  Serial.println(ssid);

  Serial.println("Wi-Fi Access Point is active!");
  Serial.println("");
}

Validating the Full Test Sketch #

When the complete official test sketch runs successfully, you should see:

  • Display & touch – the TFT initializes and shows “NORVI CONTROLLERS”; touching the screen prints gesture, point count, and X/Y coordinates.
  • Ethernet – with a cable connected and internet access available, the Serial Monitor prints the UTC time retrieved via NTP.
  • RS-485 – data sent out the A/B terminals is visible on an RS-485-to-USB converter connected to a PC.
  • SD card – card type and size are printed if a microSD card is inserted.
  • RTC – the current date/time is printed; if the RTC loses power, the sketch sets it from the compile-time clock.

Communication Protocols #

  • Modbus RTU
  • Modbus TCP
  • MQTT / MQTTS
  • HTTP / HTTPS
  • Bluetooth Low Energy (BLE) – GATT

Modbus RTU is a serial communication protocol used to exchange data between industrial devices over RS-485. Modbus TCP enables Modbus communication over Ethernet and TCP/IP networks. MQTT/MQTTS provides lightweight messaging for monitoring, data reporting, and IoT connectivity. HTTP/HTTPS supports web-based data exchange, configuration, and API integration. Bluetooth Low Energy (BLE) – GATT provides short-range communication for local commissioning, configuration, and device data exchange.

Troubleshooting #

SymptomSuggested Action
Unit does not power on / RUN indicator offVerify the 24 V DC supply is present and within tolerance at the terminals; check polarity and supply current rating (≥1 A).
Display stays blank after power-upConfirm that the firmware has been uploaded correctly. Check the TFT_eSPI library version and its internal configuration. Also, verify that PSRAM is set to QSPI PSRAM.
Arduino IDE cannot find the board/COM portCheck the USB cable and drivers, confirm ESP32S3 Dev Module is selected, and try a different USB port.
Expansion module not detectedPower down and reseat the module on the expansion bus; verify I²C address configuration does not conflict with another installed module.
RS-485 communication errors / no responseCheck A/B polarity, confirm common GND reference, verify baud rate matches the field device, and confirm termination resistors on long cable runs.
Ethernet link not establishedConfirm cable and switch port are active; verify the Ethernet controller is initialized in firmware (SCSN on IO1), and check the SPI connection.
Device resets unexpectedly under loadCheck power supply current headroom, especially when multiple expansion modules or a cellular modem module are attached.

Support & Resources #

Access NORVI X documentation, firmware resources, product information, and technical support.