# X-NODE / XN03 - Entradas/Salidas Analógicas

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FU70sXWBMEPyuBI6acP6L%2FX-NODE%20Entradas%20y%20Salidas%20Anal%C3%B3gicas%20XN03%20MICROSIDE%20XIDE%2001%20.webp?alt=media&#x26;token=cff96a13-9b56-4dc2-85c4-d97ef668e37c" alt=""><figcaption></figcaption></figure>

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><mark style="color:green;"><strong>Comprar</strong></mark></td><td><a href="https://www.microside.com/shop/x-node-entradas-salidas-analogicas-31">https://www.microside.com/shop/x-node-entradas-salidas-analogicas-31</a></td></tr></tbody></table>

El **X-NODE Analog Inputs-Outputs** es un módulo que permite generar hasta 3 señales analógicas/PWM y leer hasta 4 señales analógicas (3 entradas + 1 potenciómetro). La generación de señales analógicas puede utilizarse para controlar sistemas proporcionales, las señales PWM para controlar drivers de luces LED, drivers de motores de escobillas (brushed), etc. La lectura de señales analógicas puede utilizarse para crear sistemas de control proporcionales, medir voltaje de baterías y reguladores. Todo a través de una interfaz digital (UART/I2C) que es configurable lo que permite conectar múltiples **X-NODE Analog Inputs-Outputs** simultáneamente, expandiendo la cantidad de salidas analógicas/PWM que puede generar un sistema desde 3 hasta 381, entradas analógicas desde 3 hasta 381, y 1 hasta 127 potenciómetros.

{% hint style="warning" %}
El **X-NODE Analog Inputs-Outputs** es un dispositivo que trabaja a 3.3V, antes de conectarlo a una fuente de voltaje asegúrese que el voltaje no exceda 3.3V.
{% endhint %}

### **TABLA DE CONTENIDO**

1. [**¿Cómo funciona?**](#i.-como-funciona)
2. [**Descripción del hardware**](#ii.-descripcion-del-hardware)
3. [**Especificaciones**](#iii.-especificaciones)
4. [**Pinout**](#iv.-pinout)
5. [**Modo de uso**](#v.-modo-de-uso)
   * [**Protocolo UART**](#protocolo-uart)
   * [**Ejemplo UART Arduino Framework**](#ejemplo-uart-arduino-framework)
   * [**Protocolo I2C**](#protocolo-i2c)
   * [**Ejemplo I2C Arduino Framework**](#ejemplo-i2c-arduino-framework)
6. [**Descargas**](#vi.-descargas)
   * [**Esquemático**](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2F60L0iXekuA3YNOY0aqIu%2Fschematic.pdf?alt=media\&token=9ed4a9d0-caa8-48af-acc5-6fb5e4498658)
   * [**Dimensiones**](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2F0uKPpdW8jtZrE4D9PFIW%2Fdimensions.pdf?alt=media\&token=7cf6b960-d657-473b-8eca-b19280571d1c)

## **I. ¿Cómo funciona?**

El **X-NODE Analog Inputs-Outputs** es un módulo que integra un potenciómetro de vuelta simple, un LED RGB, 3 orificios con acceso a señales PWM y un puerto de conexión con 3 entradas y 3 salidas analógicas, 3.3V y GND. El controlador en hardware permite su uso sin tener conocimientos avanzados de hardware, ya que solo es necesario enviar una serie de comandos en formato ASCII por medio del protocolo de comunicación serial UART o usando el protocolo I2C, esto permite que el X-NODE sea compatible con cualquier sistema basado en un microcontrolador, un microprocesador o equipos industriales. El potenciómetro cuenta con un valor de resistencia de 5 kΩ, una tolerancia de ± 20% y una potencia de 5 mW. El LED RGB es capaz de generar hasta una combinación de 16 millones de colores configurando los parámetros de intensidad de los colores primarios (Rojo, Verde y Azul), con un consumo promedio de 20 mA y funcionamiento en un rango de temperatura de 0 °C hasta 80 °C. Las salidas PWM comparten el canal con las salidas analógicas, esto debe considerarse al utilizar estas salidas, la resolución es de 8 bits y la frecuencia, en el caso de las señales PWM, es de 1.2 kHz. Las entradas analógicas tienen una resolución de 10 bits, la lectura utiliza un multiplexor por lo que la frecuencia máxima de muestreo es de hasta \~37 ksps para cada canal.

**X-NODE Analog Inputs-Outputs** es compatible con el estándar [mikroBUS™](https://www.mikroe.com/mikrobus) de [Mikroe®](https://www.mikroe.com/) para un uso fácil con un gran ecosistema de kits para desarrollo de hardware, también posee conectores JST compatibles con el estándar [Qwiic®](https://www.sparkfun.com/qwiic) de [SparkFun®](https://www.sparkfun.com/) para una comunicación entre diversos módulos y tarjetas de desarrollo por medio del protocolo I2C de manera rápida y sencilla.

## **II. Descripción del hardware**

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FeLeCwjy6cfcE6pl7kHj4%2Fuser-manual-hardware-description.webp?alt=media&#x26;token=89e5947a-ba32-45a7-b131-98e8f8dd4dbc" alt=""><figcaption></figcaption></figure>

1. Puerto serigrafiado con conector tipo clema de 9 pines para cables AWG de calibre 26 a 18
2. Potenciómetro
3. Conectores JST compatibles con [Qwiic®](https://www.sparkfun.com/qwiic)
4. Indicador LED RGB
5. Orificios de acceso a señales PWM
6. Controlador en hardware
7. Puertos de comunicación UART <> I2C
8. Modelo de X-NODE
9. Tipo de X-NODE
10. Conectores estándar [mikroBUS™](https://www.mikroe.com/mikrobus)
11. Versión del hardware: R2
12. Característica principal en el X-NODE

## **III. Especificaciones**

<table data-header-hidden><thead><tr><th width="172"></th><th></th></tr></thead><tbody><tr><td><strong>Tipo</strong></td><td>Entradas y salidas analógicas</td></tr><tr><td><strong>Aplicaciones</strong></td><td>Integración en proyectos de IoT con uso de propósito general como en lectura de señales y cambios de estado o secuencias con actuadores y motores. Potenciómetro útil para control de movimiento, activación de sistemas o calibración de componentes con precisión. LED RGB ideal para alertas visuales, ambientación de espacios mediante luz en hogares inteligentes, así como indicador de estado en diferentes componentes, alarmas y secuencias.</td></tr><tr><td><strong>Características</strong></td><td>Potenciómetro de vuelta simple con ángulo ajustable, con un valor de resistencia de 5 kΩ, una tolerancia de ± 20% y una potencia de 5 mW. LED RGB capaz de generar hasta 16 millones de colores a partir de una señal PWM, con un consumo promedio de 20 mA y funcionamiento en un rango de temperatura de 0 hasta 80 °C. Clema de 9 pines para cables AWG de calibre 26 a 18 para 3 entradas y 3 salidas analógicas externas, 3.3V y GND. Orificios para acceso de señales PWM.</td></tr><tr><td><strong>Interfaz</strong></td><td>UART, I2C</td></tr><tr><td><strong>Compatibilidad</strong></td><td>Estándar <a href="https://www.mikroe.com/mikrobus">mikroBUS™</a> y estándar <a href="https://www.sparkfun.com/qwiic">Qwiic®</a> </td></tr><tr><td><strong>Tamaño</strong></td><td>65.09 x 25.38 x 26.98 mm</td></tr><tr><td><strong>Voltaje</strong> </td><td>3.3 V </td></tr></tbody></table>

## **IV. Pinout**

La siguiente tabla muestra el pinout del **X-NODE Analog Inputs-Outputs** con respecto al estándar  [**mikroBUS™**](https://www.mikroe.com/mikrobus) (este último se encuentra en las dos columnas del centro).

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FJo1oZSK1hQRwkYoRQILz%2Fuser-manual-mikrobus-pinout-table.jpg?alt=media&#x26;token=658ae120-a66c-401f-8bd0-e8a7e97a22e6" alt=""><figcaption></figcaption></figure>

## **V. Modo de uso**

Para un uso fácil y rápido del X-NODE se puede hacer a través de los comandos en formato ASCII que proporciona el controlador en hardware integrado mediante una comunicación serial UART o de forma más avanzada a través del protocolo I2C.

### Protocolo UART

La comunicación UART utiliza la siguiente configuración:

* Velocidad de comunicación: 115,200 bps
* Paridad: Ninguna
* Bits de datos: 8
* Bits de paro: 1

#### Sintaxis

El protocolo UART permite enviar instrucciones en texto plano *ASCII*, cada instrucción se compone del identificador del X-NODE, un comando y un final de línea.

**Identificador**

El identificador **ID**, se conforma por el modelo del X-NODE, que puede localizar en el punto 6 del apartado Descripción de hardware y se complementa con un índice, que puede ser una letra del abecedario, por defecto es la letra **A**, siendo posible configurarlo hasta la letra **Z**. Para poder conectar más de un módulo del mismo modelo en un sistema, deberá configurar un identificador único para cada módulo, brindando la posibilidad de conectar hasta 26 módulos del mismo modelo a través del protocolo UART.

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FnS11vUE0rZPOEQQeNbH3%2Fuser-manual-uart-protocol-index-rule.jpg?alt=media&#x26;token=543e6961-94a3-4884-90c2-ed02414344bb" alt="XNO3_MICROSIDE"><figcaption></figcaption></figure>

{% hint style="warning" %}
**Nota:** A partir de este punto se usará el índice predeterminado del X-NODE **XN03 - Analog Inputs-Outputs** para el resto del manual: **XN03A**.
{% endhint %}

#### Lista de comandos

<table data-header-hidden><thead><tr><th width="194.20001220703125"></th><th></th></tr></thead><tbody><tr><td><strong>XN03A?</strong></td><td>Verifica si se estableció una comunicación con éxito.<br><strong>Respuesta:</strong> OK</td></tr><tr><td><strong>XN03A+V</strong></td><td>Obtiene la versión del firmware actual que integra el X-NODE.<br><strong>Respuesta:</strong> XN03A=Versión<br><strong>Ejemplo:</strong> XN03A=0.1</td></tr><tr><td><strong>XN03A+ID=(A-Z)</strong></td><td>Cambia el índice del ID por una letra diferente del abecedario de la A a la Z, la nueva letra debe ser en mayúscula. Una vez modificado, para volver a cambiarlo es necesario colocar el ID con el nuevo índice.<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN03C+ID=H</td></tr><tr><td><strong>XN03A+TW=(1-126)</strong></td><td>Cambia la dirección I2C que viene de fábrica por uno diferente. La nueva dirección se escribe en decimal seleccionando un valor de 1 a 126.<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN03A+TW=28</td></tr><tr><td><strong>XN03A+GP</strong></td><td>Obtiene el valor del potenciómetro dado por su posición. Retorna con un valor relativo de 0 a 100.<br><strong>Respuesta:</strong> XN03A=VAL<br><strong>Ejemplo:</strong> XN03A=67</td></tr><tr><td><strong>XN03A+S=(Out1/PWM1/Rojo),(Out2/PWM2/Verde),(Out3/PWM3/Azul)[,(Scale)</strong></td><td>Cambia el estado de cada una de las 3 salidas, sea directamente en el puerto de salidas analógicas, en los orificios de acceso PWM o en los colores del indicador LED RGB, con valores entre 0 a 255, opcionalmente enviar un cuarto valor entre 0 a 255 permite escalar los canales (RGBa).<br><strong>Respuesta:</strong> OK<br><strong>Ejemplo de envío:</strong> XN03A+S=0,25,100</td></tr><tr><td><strong>XN03A+G(P,1,2,3)</strong></td><td>Obtiene el valor del potenciómetro dado por su posición o de las entradas analógicas (1,2,3). Retorna con un valor relativo de 0 a 100.<br><strong>Respuesta:</strong> XN03A=VAL<br><strong>Ejemplo de envío:</strong> XN03A+GP<br><strong>Ejemplo de respuesta</strong>XN03A=67</td></tr><tr><td><strong>XN03A+A(P,1,2,3)</strong></td><td>Obtiene el valor del potenciómetro dado por su posición o de las entradas analógicas (1,2,3) con la resolución del ADC (10 bits). Retorna con un valor relativo de 0 a 1023.<br><strong>Respuesta:</strong> XN03A=VAL<br><strong>Ejemplo de envío:</strong> XN03A+AP<br><strong>Ejemplo de respuesta</strong>XN03A=512</td></tr></tbody></table>

#### Final de línea

El X-NODE solo responderá a un comando cuando se envíe un conjunto de caracteres finalizadores de línea, cada comando debe terminar con estos caracteres: **\<CR+LF>**

* CR significa retorno de carro (carriage return), este carácter se utiliza para indicar a un sistema que la entrada de texto debe moverse al principio.
* LF significa alimentación de línea (line feed), este carácter le indica a un sistema que la entrada de texto corresponde a una nueva línea.

La combinación de ambos caracteres es una manera común con el que las computadoras representan una nueva línea, por ejemplo, en un procesador de texto para separar párrafos.

En el caso del X-NODE los caracteres **\<CR+LF>**, se utilizan para identificar cuando se ha terminado de enviar un comando. Si el identificador corresponde al nodo, si el comando existe y si se finalizó inmediatamente con los caracteres **\<CR+LF>**, entonces el nodo enviará una respuesta.

Dependiendo del sistema, deberá configurar el envío de estos caracteres de maneras diferentes.

#### Ejemplo UART Arduino Framework

{% hint style="info" %}
Código de ejemplo para el [**XC01 - R5**](https://docs.microside.com/plataforma-xide-iot/x-nodes/xc01-controlador-wifi-and-bluetooth/r5/x-node-xc01-esp32-s3-controlador-wifi-and-bluetooth), revisa el manual para utilizar nuestro [XC01 - R5 en **Arduino IDE/PlatformIO**](https://docs.microside.com/plataforma-xide-iot/xc01-controlador-wifi-and-bluetooth/r5/x-node-xc01-esp32-s3-controlador-wifi-and-bluetooth#configuracion-para-platformio-en-vs-code)
{% endhint %}

```cpp

// Este ejemplo permite controlar la intensidad del 
// LED RGB del X-NODE utilizando el potenciómetro.

#include "Arduino.h"

// Configura este valor para cambiar el color RGB
const uint8_t rgb_color[] = { 227, 235, 23 };

void setup() {
  // Inicializa el monitor serial
  Serial.begin(115200);

  // Inicializa la comunicación UART en el puerto MikroBUS
  Serial2.begin(115200, SERIAL_8N1, 9, 10);
}

void loop() {
  // Controla la intensidad del led RGB con el potenciómetro del XN03

  // Limpiamos el buffer
  if (Serial2.available()) {
    Serial2.read();
  }

  // Envía el comando para obtener la posición del potenciómetro
  // Los caracteres \r\n representan los caracteres
  // <CR+LF> en en lenguaje de programación C/C++
  Serial2.print("XN03A+GP\r\n");

  // Espera hasta recibir una respuesta
  String pot_value = Serial2.readStringUntil('\n');

  // Si la respuesta comienza por el ID
  // entonces la comunicación fue exitosa
  if (!pot_value.startsWith("XN03A=")) {
    Serial.println("Error");
    delay(1000);
    return;
  }

  // Convierte el valor en ASCII a un valor decimal
  int brightness = pot_value.substring(pot_value.indexOf('=') + 1).toInt();

  // Limpiamos el buffer
  if (Serial2.available()) {
    Serial2.read();
  }

  // Envía el comando para cambiar el valor de las salidas
  Serial2.print("XN03A+S=");
  Serial2.print(rgb_color[0]);
  Serial2.print(",");
  Serial2.print(rgb_color[1]);
  Serial2.print(",");
  Serial2.print(rgb_color[2]);
  Serial2.print(",");
  Serial2.println(brightness);

  // Espera hasta recibir una respuesta
  String success = Serial2.readStringUntil('\n');

  // Si la respuesta es "OK"
  // entonces la comunicación fue exitosa
  if (!success.startsWith("OK")) {
    Serial.println("Error");
    delay(1000);
    return;
  }

  delay(100);
}

```

### Protocolo I2C

Para poder establecer comunicación se debe conocer la dirección I2C del X-NODE, el valor de fábrica se conforma por los dos últimos dígitos del modelo después de “XN”. Las direcciones I2C suelen representarse en sistema **hexadecimal**, mientras que el modelo del X-NODE está en sistema **decimal**, asegúrese de utilizar el sistema numérico adecuado.

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FOk385Oa61q1jKZnQVjVg%2Fuser-manual-i2c-protocol-address-rule.jpg?alt=media&#x26;token=68302b6f-6880-4d5e-9c07-ab03e8502255" alt="XNO3_MICROSIDE_02"><figcaption></figcaption></figure>

#### Configuración

* Velocidad de comunicación: 100 kHz
* Address: 7 bits

{% hint style="info" %}
**Nota:** Verifica que no cuentes con otro dispositivo con la misma dirección (Address) en el BUS I2C, de ser así recuerda que el X-NODE puede cambiar su dirección I2C con el comando **XN03A+TW=(1-126)**.
{% endhint %}

#### Escritura

Para escribir en un registro del **X-NODE Digital Inputs** el maestro I2C debe generar las siguientes operaciones:

1. Enviar una **condición de inicio**: El maestro genera un lógico bajo (0) en el pin SDA, mientras SCL permanece en alto (1).
2. Enviar la dirección del **X-NODE**: El maestro envía la dirección de 7 bits.
3. Enviar el **tipo de operación**: El maestro indica si la operación es de lectura (0) o de escritura (1).
4. Esperar una señal de **reconocimiento (ACK)**: El maestro espera a recibir un lógico bajo (0), como confirmación (Acknowledgment) que exista un dispositivo con la dirección enviada previamente en el BUS I2C. Si no se recibe respuesta (1), significa que hubo un error en la comunicación o la dirección es incorrecta.
5. Escribir **n bytes** de datos: El maestro escribirá en secuencias de 8 bits (1 byte) y en orden del bit más significativo primero (MSB) n cantidad de bytes que desea escribir en el registro, el dispositivo enviará una señal de **reconocimiento (ACK)** por cada byte escrito.
6. Enviar una **condición de paro**: El maestro debe liberar el BUS I2C generando un lógico alto (1) en el pin SDA mientras que SCL se encuentra en un lógico alto (1).

#### Lectura

Para leer en un registro del **X-NODE Digital Inputs** el maestro I2C debe generar las siguientes operaciones:

1. Enviar una **condición de inicio**: El maestro genera un lógico bajo (0) en el pin SDA, mientras SCL permanece en alto (1).
2. Enviar la dirección del **X-NODE**: El maestro envía la dirección de 7 bits.
3. Enviar el **tipo de operación**: El maestro indica si la operación es de lectura (0) o de escritura (1).
4. Esperar una señal de **reconocimiento (ACK)**: El maestro espera a recibir un lógico bajo (0), como confirmación (Acknowledgment) que exista un dispositivo con la dirección enviada previamente en el BUS I2C. Si no se recibe respuesta (1), significa que hubo un error en la comunicación o la dirección es incorrecta.
5. Leer **n bytes** de datos: El dispositivo enviará secuencias de 8 bits (1 byte) y en orden del bit más significativo primero (MSB) n cantidad de bytes, al recibir un byte, el maestro deberá generar una señal de **reconocimiento (ACK)** para solicitar 1 byte más, o una señal de **no reconocimiento (NACK)** para indicar que ha finalizado la transmisión y solicitar el dispositivo que libere el BUS.
6. Enviar una **condición de paro**: El maestro debe liberar el BUS I2C generando un lógico alto (1) en el pin SDA mientras que SCL se encuentra en un lógico alto (1).

#### Lista de registros

En un dispositivo I2C los registros son direcciones de memoria que permiten configurar u obtener datos del dispositivo. Existen dos tipos de operaciones: de lectura (R) y de escritura (W).

<table><thead><tr><th width="112.79998779296875">Registro</th><th width="96" align="center">Dirección</th><th width="82.79998779296875" align="center">Tipo</th><th width="87.39996337890625" align="center">No. Bytes</th><th width="344.80010986328125">Descripción</th></tr></thead><tbody><tr><td>O1_RED</td><td align="center">0x01</td><td align="center">R/W</td><td align="center">1 a 4</td><td>El primer byte representa el canal O-1 (rojo) del DAC, el segundo el canal O-2 (verde), el tercero el canal O-3 (azul), enviar un byte 4 permite escalar la intensidad de los canales (RGBa)</td></tr><tr><td>O2_GREEN</td><td align="center">0x02</td><td align="center">R/W</td><td align="center">1 a 3</td><td>El primer byte representa el canal O-2 (verde) del DAC, el segundo el canal O-3 (azul), enviar un byte 3 permite escalar la intensidad de los canales O-2 y O- 3 (GBa), el primer canal no se verá afectado.</td></tr><tr><td>O3_BLUE</td><td align="center">0x03</td><td align="center">R/W</td><td align="center">1 a 2</td><td>El primer byte representa el canal O-3 (azul) del DAC, enviar un byte 2 permite escalar la intensidad del canal 3 (Ba), el canal O-1 y O-2 no se verán afectados.</td></tr><tr><td>IN_POT</td><td align="center">0x10</td><td align="center">R</td><td align="center">1</td><td>Retorna el valor del ADC del potenciómetro escalado de 0 (0x00) a 100 (0x64)</td></tr><tr><td>IN1</td><td align="center">0x11</td><td align="center">R</td><td align="center">1</td><td>Retorna el valor del ADC del canal I-1 escalado de 0 (0x00) a 100 (0x64)</td></tr><tr><td>IN2</td><td align="center">0x12</td><td align="center">R</td><td align="center">1</td><td>Retorna el valor del ADC del canal I-2 escalado de 0 (0x00) a 100 (0x64)</td></tr><tr><td>IN3</td><td align="center">0x13</td><td align="center">R</td><td align="center">1</td><td>Retorna el valor del ADC del canal I-3 escalado de 0 (0x00) a 100 (0x64)</td></tr><tr><td>ADC_POT</td><td align="center">0x20</td><td align="center">R</td><td align="center">2</td><td>Retorna el valor del ADC del potenciómetro, con una resolución de 10 bits, 0 (0x00) a 1023 (0x3FF).</td></tr><tr><td>ADC1</td><td align="center">0x21</td><td align="center">R</td><td align="center">2</td><td>Retorna el valor del ADC del canal I-1, con una resolución de 10 bits, 0 (0x00) a 1023 (0x3FF).</td></tr><tr><td>ADC2</td><td align="center">0x22</td><td align="center">R</td><td align="center">2</td><td>Retorna el valor del ADC del canal I-2, con una resolución de 10 bits, 0 (0x00) a 1023 (0x3FF).</td></tr><tr><td>ADC3</td><td align="center">0x23</td><td align="center">R</td><td align="center">2</td><td>Retorna el valor del ADC del canal I-3, con una resolución de 10 bits, 0 (0x00) a 1023 (0x3FF).</td></tr><tr><td>STAT</td><td align="center">0x37</td><td align="center">R</td><td align="center">1</td><td>Estado del XNODE, 0x00 si no hay errores, cualquier otro valor significa error en la comunicación.</td></tr><tr><td>FW</td><td align="center">0x38</td><td align="center">R</td><td align="center">3</td><td>Versión de firmware, en versión mayor, menor y parche: 0x02.0x00.0x00</td></tr><tr><td>UART_ID</td><td align="center">0x39</td><td align="center">R/W - NV</td><td align="center">1</td><td>Permite leer y escribir el índice del ID por una letra diferente del abecedario de la A (0x41) a la Z (0x5A)</td></tr><tr><td>TW_ADD</td><td align="center">0x3A</td><td align="center">R/W - NV</td><td align="center">1</td><td>Permite leer y escribir la dirección I2C del dispositivo por uno diferente de 1 (0x01) a 126 (0x7D).</td></tr><tr><td>UART_EN</td><td align="center">0x3B</td><td align="center">W</td><td align="center">1</td><td>Habilita (0x01) o deshabilita (0x00) la interfaz UART del dispositivo.</td></tr><tr><td>SLEEP</td><td align="center">0x3C</td><td align="center">W</td><td align="center">1</td><td>Habilita (0x01) o deshabilita (0x00) el descanso profundo del dispositivo, el dispositivo despertará si el maestro escribe la dirección I2C del dispositivo en el BUS.</td></tr><tr><td>RESET</td><td align="center">0x3D</td><td align="center">W</td><td align="center">1</td><td>Si se escribe un 0x01 reinicia el dispositivo.</td></tr><tr><td>WHO_AM_I</td><td align="center">0x3E</td><td align="center">R</td><td align="center">2</td><td>El primer byte es el modelo del XNODE, el segundo byte es la revisión de hardware</td></tr></tbody></table>

**Registros No volatiles (NV)**

Los registros no volatiles se guardan en la memoria EEPROM del dispositivo, lo que significa que conservarán los valores escritos en ellos incluso si el dispositivo se apaga.

**Estructura del registro OUT1, OUT2, OUT3:**

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FcaU5nRdVIJp5KXyT31mi%2Fuser-manual-i2c-protocol-register-outputs-write.png?alt=media&#x26;token=46118953-9171-4c4a-a7bd-6c4f1faa8729" alt=""><figcaption></figcaption></figure>

**Estructura del registro IN\_POT, IN1, IN2, IN3:**

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FKad0iVwZgU5CFhBN6o9r%2Fuser-manual-i2c-protocol-register-inputs-read.png?alt=media&#x26;token=62d42ca7-ce74-4b7d-9c70-d473959f224f" alt=""><figcaption></figcaption></figure>

**Estructura del registro ADC\_POT, ADC1, ADC2, ADC3:**

<figure><img src="https://177299348-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2FgmEk0q5UiCYbvtE9tdgD%2Fuser-manual-i2c-protocol-register-inputs-raw-read.png?alt=media&#x26;token=ea9a034b-7d7f-483c-8941-db987940cd9a" alt=""><figcaption></figcaption></figure>

#### Ejemplo I2C Arduino Framework

{% hint style="info" %}
Código de ejemplo para el [**XC01 - R5**](https://docs.microside.com/plataforma-xide-iot/x-nodes/xc01-controlador-wifi-and-bluetooth/r5/x-node-xc01-esp32-s3-controlador-wifi-and-bluetooth), revisa el manual para utilizar nuestro [XC01 - R5 en **Arduino IDE/PlatformIO**](https://docs.microside.com/plataforma-xide-iot/xc01-controlador-wifi-and-bluetooth/r5/x-node-xc01-esp32-s3-controlador-wifi-and-bluetooth#configuracion-para-platformio-en-vs-code)
{% endhint %}

```cpp

// Este ejemplo permite controlar la intensidad del 
// LED RGB del X-NODE utilizando el potenciómetro.

#include <Arduino.h>
#include <Wire.h>

// Configura este valor para cambiar el color RGB
const uint8_t rgb_color[] = { 227, 235, 23 };

void setup() {
  // Inicializa el monitor serial
  Serial.begin(115200);

  // Configura los pines de la comunicación I2C
  Wire.setPins( 12, 13 );
  // Inicializa la comunicación I2C
  Wire.begin();
}

void loop() {
  // Controla la intensidad del led RGB con el potenciómetro del XN03

  uint8_t bytes_recv = 0;
  uint8_t pot = 0;

  // Enviar condición de inicio + dirección
  // + tipo operación
  Wire.beginTransmission(0x03);
  // Escribe la dirección del registro del potenciómetro (0x1E)
  Wire.write(0x10);

  // Verificar si la operación fue exitosa
  if (Wire.endTransmission() != 0) {
    Serial.println("Error al solicitar el registro");
    delay(1000);
    return;
  }

  // Enviar condición de inicio + dirección
  // + tipo operación + cantidad de bytes a leer
  bytes_recv = Wire.requestFrom(0x03, 1);

  // Confirmar que se recibió 1 byte
  if (bytes_recv != 1) {
    Serial.println("Error al leer el registro");
    delay(1000);
    return;
  }

  pot = Wire.read();

  // Enviar condición de inicio + dirección
  // + tipo operación
  Wire.beginTransmission(0x03);

  // Escribe la dirección del registro del canal 1 (0x01)
  Wire.write(0x01);
  // Escribir el valor del canal 1 (color rojo)
  Wire.write(rgb_color[0]);
  // Escribir de forma secuencial asigna el valor del canal 2 (verde)
  Wire.write(rgb_color[1]);
  // El canal 3 (azul)
  Wire.write(rgb_color[2]);
  // Y la intensidad
  Wire.write(pot);

  if (Wire.endTransmission() != 0){
    Serial.println("Error al escribir el valor RGB");
    delay(1000);
  }

  delay(100);
}

```

## **VI. Descargas**

<table data-card-size="large" data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><mark style="color:green;"><strong>Esquemático</strong></mark></td><td><a href="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2F60L0iXekuA3YNOY0aqIu%2Fschematic.pdf?alt=media&#x26;token=9ed4a9d0-caa8-48af-acc5-6fb5e4498658">https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2F60L0iXekuA3YNOY0aqIu%2Fschematic.pdf?alt=media&#x26;token=9ed4a9d0-caa8-48af-acc5-6fb5e4498658</a></td></tr><tr><td align="center"><mark style="color:green;"><strong>Dimensiones</strong></mark></td><td><a href="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2F0uKPpdW8jtZrE4D9PFIW%2Fdimensions.pdf?alt=media&#x26;token=7cf6b960-d657-473b-8eca-b19280571d1c">https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbyV2zAlQAiqg46a3Lr8z%2Fuploads%2F0uKPpdW8jtZrE4D9PFIW%2Fdimensions.pdf?alt=media&#x26;token=7cf6b960-d657-473b-8eca-b19280571d1c</a></td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.microside.com/plataforma-xide-iot/x-nodes/xn03-entradas-salidas-analogicas/r2/x-node-xn03-entradas-salidas-analogicas.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
