Introducción
NuttX es un sistema operativo en tiempo real (RTOS) muy versátil y configurable, que destaca por su cumplimiento de estándares y su huella mínima. Está diseñado para escalar en una gran variedad de entornos de microcontroladores y admite desde arquitecturas de 8 bits hasta de 64 bits. Esta flexibilidad lo hace una excelente opción para muchos tipos de sistemas embebidos, incluidos los basados en el microcontrolador ESP32.
Uno de los puntos fuertes de NuttX es su compromiso con los estándares de la industria, en concreto POSIX (Portable Operating System Interface) y ANSI (American National Standards Institute). Esto ofrece a los programadores un entorno de desarrollo conocido y estandarizado, y convierte a NuttX en una opción sólida para proyectos de sistemas embebidos.
En este artículo veremos una breve introducción al entorno y cómo enviar datos por el puerto Serial1.
Instalación del entorno
Empezamos instalando algunos paquetes:
sudo apt install automake bison build-essential flex gperf git libncurses5-dev libtool libusb-dev pkg-config
Y creamos un directorio donde se guardarán todos los archivos:
mkdir nuttxspace && cd nuttxspace
Dentro del directorio, clonamos estos dos repositorios de Git:
git clone https://github.com/apache/incubator-nuttx.git nuttx
git clone https://github.com/apache/incubator-nuttx-apps.git apps
Después, usamos este comando:
sudo apt install kconfig-frontends
A continuación, descargamos este archivo TAR y extraemos su contenido:
curl https://dl.espressif.com/dl/xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz | tar -xz
Ahora creamos una carpeta en /opt y movemos allí el contenido del TAR, así:
sudo mkdir /opt/xtensa
sudo mv xtensa-esp32-elf /opt/xtensa
Modificamos la variable PATH para añadir la ruta que hemos creado:
export PATH=$PATH:/opt/xtensa-esp32-elf/bin
También puedes añadirlo a la configuración de tu shell para que el cambio en PATH sea permanente.
Instalamos el paquete esptool con pip3:
pip3 install esptool
Después, creamos otra carpeta llamada esp-bins y descargamos allí los siguientes binarios:
mkdir esp-bins
curl -L "https://github.com/espressif/esp-nuttx-bootloader/releases/download/latest/bootloader-esp32.bin" -o esp-bins/bootloader-esp32.bin
curl -L "https://github.com/espressif/esp-nuttx-bootloader/releases/download/latest/partition-table-esp32.bin" -o esp-bins/partition-table-esp32.bin
Por último, compilamos la shell y cargamos el código en el PLC ESP32. Tu usuario debe pertenecer al grupo dialout:
cd nuttx
./tools/configure.sh esp32-devkitc:nsh
make
make download ESPTOOL_PORT=/dev/ttyUSB0 ESPTOOL_BAUD=115200 ESPTOOl_BINDIR=../esp-bins
picocom -b 115200 /dev/ttyUSB0
Ahora reinicia el PLC y deberías ver un prompt como nsh> . ¡Has configurado correctamente tu entorno NuttX en un PLC ESP32! Para salir de picocom, usa Ctrl-A + Ctrl-X.

Configuración del RTOS
Los pasos siguientes activan el ejemplo serialblaster y lo configuran correctamente.
- Activación del ejemplo:
cd nuttxspace/nuttx
make distclean
./tools/configure.sh esp32-devkitc:nsh
make menuconfig
Con las flechas arriba y abajo del teclado, ve a "Application Configuration", luego a "Examples" y selecciona "Serial Blaster example" con la tecla y. Cambia el "Serial device path" a /dev/ttyS1 y, por último, sal del menú con "Exit" y guarda la configuración.
- "Serial Driver support": comprueba que el soporte del driver serie esté activado.
Desde el inicio del comando make menuconfig, ve a "Device Drivers" y selecciona (con y) "Serial Device Driver Support".
- Activación del puerto serie /dev/ttyS1:
De nuevo en make menuconfig, ve a "System Type", luego a "ESP32 Peripheral Selection" y activa "UART 1". Vuelve a "System Type", entra en "UART Configuration" y cambia los pines de UART1: Tx al 17 y Rx al 16. Sal y guarda.

Después de estos pasos, ejecutando de nuevo:
cd nuttx
./tools/configure.sh esp32-devkitc:nsh
make
make download ESPTOOL_PORT=/dev/ttyUSB0 ESPTOOL_BAUD=115200 ESPTOOL_BINDIR=../esp-bins
picocom -b 115200 /dev/ttyUSB0
Deberías poder ver el ejemplo serialblaster escribiendo "?" en el prompt
Programa para Arduino IDE
El ejemplo serialblaster envía por Serial1 (pines 16 y 17) la cadena "abcdefghijklmnopqrstuvwxyz" (consulta el archivo serialblaster_main.c, dentro de apps/examples/serialblaster). Para poder leer la cadena, crearemos un programa para otro PLC de Industrial Shields. Este segundo PLC puede estar basado en Arduino o en ESP32, es indiferente.
Como solo vamos a escribir en el puerto serie lo que recibamos por Serial1, usa el siguiente código:
void setup() {
// Begin serial port
Serial.begin(115200);
// Begin Serial1 port
Serial1.begin(115200);
}
void loop() {
if (Serial1.available()) {
byte tx = Serial1.read();
Serial.write(tx);
}
}
Conexiones
Las conexiones son muy sencillas. Siguiendo la serigrafía de los PLC, conecta el Tx de Serial1 del PLC ESP32 al Rx de Serial1 del segundo PLC, y el Rx de Serial1 del PLC ESP32 al Tx de Serial1 del segundo PLC.
Además, comprueba que el interruptor número 3 del PLC basado en ESP32 esté en ON. Configura también el otro PLC como corresponda.
Para más información, consulta las guías de usuario.
Prueba final
Tras todos los preparativos, es hora de probar el ejemplo. Dentro de picocom, escribe serialblaster. Pasados 1 o 2 segundos, deberías ver el alfabeto transmitido al segundo PLC.

Conclusiones
En este artículo hemos visto cómo trabajar con Apache NuttX e interactuar con comunicaciones serie, como Serial1 del PLC ESP32. Ahora te toca explorar a fondo el RTOS NuttX y crear tu propia aplicación, aprovechando las E/S que ofrece el PLC y mucho más.