Saltar al contenido principal

Hardware de Robotics J501 e Introducción

La reComputer Robotics J501 es una carrier board de IA perimetral de alto rendimiento diseñada para aplicaciones avanzadas de robótica e industriales. Compatible con módulos NVIDIA Jetson AGX Orin (32GB/64GB) en modo MAXN, ofrece hasta 275 TOPS de rendimiento de IA.

Equipada con amplias opciones de conectividad —incluyendo 1x 10GbE y 4x 1GbE Ethernet, ranuras duales M.2 Key M para SSD NVMe, ranuras M.2 para módulos 5G y Wi-Fi/BT, múltiples puertos USB 3.0, cuatro interfaces CAN (2 nativas + 2 SPI-a-CAN), expansión de cámara GMSL2 y E/S completas que incluyen DI/DO, I2S, UART y RS485— sirve como un potente cerebro robótico para fusión de múltiples sensores complejos y procesamiento de IA en tiempo real.

Con JetPack 6.2.1 y Linux BSP preinstalados, garantiza un despliegue sin problemas. Al ser compatible con frameworks como NVIDIA Isaac ROS, Hugging Face, PyTorch y ROS 2/1, la J501 conecta la toma de decisiones impulsada por modelos de lenguaje grandes con el control físico de la robótica, acelerando el desarrollo de robots autónomos con interfaces listas para usar y frameworks de IA optimizados.

Características clave

  • IA de alto rendimiento: Hasta 275 TOPS con módulos Jetson AGX Orin 32/64GB, GPU Ampere y motores DLA
  • Conectividad rica: Doble M.2 Key M (NVMe); Key E (WiFi/BT) + Key B (5G); 1x 10GbE + 4x 1GbE; 3x USB 3.0; 2x USB-C
  • Cuatro CAN-FD: 2x interfaces nativas + 2x SPI-a-CAN con aislamiento eléctrico
  • Visión GMSL2: Interfaz GMSL2 única (1x) para conexión de cámara de alta velocidad
  • Diseño industrial: Entrada DC de 19-48V; funcionamiento de -10~60°C; interfaces aisladas; JetPack 6.2.1 preinstalado
  • Lista para robótica: Compatibilidad con ROS 2/1, Isaac ROS; DI/DO, I2S, UART, RS485; optimizada para AMR y automatización

Especificaciones

Módulo Jetson AGX Orin System on Module
EspecificacionesreComputer Robotics J5011reComputer Robotics J5012
MóduloNVIDIA Jetson AGX Orin 32GBNVIDIA Jetson AGX Orin 64GB
Rendimiento de IA200 TOPS275 TOPS
GPU1792 núcleos NVIDIA Ampere @ 930 MHz2048 núcleos NVIDIA Ampere @ 1.3 GHz
CPU8 núcleos Arm Cortex-A78AE @ 2.0 GHz12 núcleos Arm Cortex-A78AE @ 2.2 GHz
Memoria32GB 256-bit LPDDR5 @ 204.8 GB/s64GB 256-bit LPDDR5 @ 204.8 GB/s
Codificador de vídeo1x 4K60 / 3x 4K30 / 6x 1080p60 / 12x 1080p30 (H.265)2x 4K60 / 6x 4K30 / 8x 1080p60 / 16x 1080p30 (H.265)
Decodificador de vídeo1x 8K30 / 2x 4K60 / 4x 4K30 / 9x 1080p60 / 18x 1080p30 (H.265)1x 8K30 / 3x 4K60 / 7x 4K30 / 11x 1080p60 / 22x 1080p30 (H.265)
Cámara CSIHasta 6 cámaras (16 mediante canales virtuales)
16 líneas MIPI CSI-2
D-PHY 2.1 (hasta 40Gbps) / C-PHY 2.0 (hasta 164Gbps)
Mecánico100mm x 87mm
Conector Molex Mirror Mezz de 699 pines
Placa de transferencia térmica integrada
Carrier Board
Almacenamiento2x M.2 Key-M (NVMe 2280 SSD)
1x M.2 Key-B (para módulos 4G/5G)
Red1x M.2 Key-E (WiFi/BT)
1x RJ45 10GbE + 4x RJ45 1GbE
USB3x USB 3.0 Tipo-A
1x USB 3.0 Tipo-C (Recovery)
1x USB 2.0 Tipo-C (Debug UART)
DI/DO/CAN1x bloque de terminales 2x10P 3.81mm - 4x DI @12V + 4x DO @40V + 4x CAN (compatible con CAN-FD, eléctricamente aislado)
GMSL2x conector Mini-Fakra (para 8x cámaras GMSL2) (opcional)
Serie2x DB9 (RS232/422/485)
Pantalla1x HDMI 2.1
Ventilador1×12 V (2.54 mm), 1×5 V (JST 1.25 mm)
Botón1x Recovery + 1x Reset
LED3x LED (PWR, SSD y LED de usuario)
RTC1x soporte para batería CR1220, 1x cabecera RTC de 2 pines
Entrada de alimentación19-48V DC mediante bloque de terminales de 5.08mm (adaptador de alimentación no incluido)
Consumo de energíaMódulo Jetson AGX Orin: Hasta 60W (modo MAXN)
Pico total del sistema: 75W (incluyendo periféricos)
SoftwareJetpack 6.2.1
Mecánico

Dimensiones: 210mm x 180mm x 87mm (con soportes)
Peso: 200g
Montaje: Escritorio / Pared / Carril DIN (soporte DIN incluido en los accesorios)
Temperatura de funcionamiento: -10℃~60℃ (25W) / -10℃~55℃ (MAXN)

Garantía2 años
CertificaciónRoHS, REACH, CE, FCC, UKCA, KC

Especificaciones de la placa de extensión GMSL (opcional)

DeserializadorMAX96712
Interfaz GMSL2x conector Robotics-Fakra macho
Entrada GMSLHasta 8x cámaras GMSL2
Método de conexiónCable GMSL2 Fakra 1-a-4 M-M
Función de la interfaz POCAdmite transmisión simultánea de energía y datos

Visión general del hardware

📦 Flashear el sistema operativo JetPack

Módulo compatible

Requisitos previos

  • PC host con Ubuntu
  • reComputer Robotics J501
  • Cable de transmisión de datos USB Tipo-C
info

Recomendamos que utilices dispositivos host físicos con Ubuntu en lugar de máquinas virtuales. Consulta la siguiente tabla para preparar la máquina host.

Versión de JetPack Versión de Ubuntu (ordenador host)
18.04 20.04 22.04
JetPack 6.x

Preparar la imagen de Jetpack

Aquí, necesitamos descargar la imagen del sistema a nuestro PC con Ubuntu correspondiente al módulo Jetson que estamos utilizando:

Versión de JetpackMódulo Jetson GMSL Enlace de descarga1SHA256
6.2.1 AGX Orin 64GBDownload46167c63566fa07d9882be338becd44
7021c8fc0a73da18d0291c414cf5c6f4a
AGX Orin 32GBDownloade868fd8c7ad05d3acc8c9808f42e1835
28f11df14f48cb6ae16464adb4f23d1f
peligro

El archivo de imagen de Jetpack6 tiene un tamaño aproximado de 14.2GB y debería tardar alrededor de 60 minutos en descargarse. Por favor, espera pacientemente a que la descarga se complete.

info

Para verificar la integridad del firmware descargado, puedes comparar el valor hash SHA256.

En una máquina host con Ubuntu, abre la terminal y ejecuta el comando sha256sum <File> para obtener el valor hash SHA256 del archivo descargado. Si el hash resultante coincide con el hash SHA256 proporcionado en la wiki, confirma que el firmware que descargaste está completo e intacto.

⚙️ Todos los archivos .dts y demás código fuente de las carrier boards Jetson de SEEED se pueden descargar desde Linux_for_Tegra

Entrar en modo Force Recovery

info

Antes de continuar con los pasos de instalación, debemos asegurarnos de que la placa esté en modo force recovery.

Paso a paso

Paso 1. Conecta un cable de transmisión de datos USB Type-C entre el puerto USB2.0 DEVICE y el PC host con Ubuntu.

Paso 2. Usa un pin e insértalo en el orificio RECOVERY para presionar el botón de recuperación y mantenlo presionado.

Paso 3. Conecta la fuente de alimentación.

Paso 4. Suelta el botón de recuperación.

Paso 5. En el PC host con Linux, abre una ventana de Terminal e introduce el comando lsusb. Si el contenido devuelto incluye una de las siguientes salidas según el Jetson SoM que utilices, entonces la placa está en modo force recovery.

  • Para AGX Orin 32GB: 0955:7223 NVidia Corp
  • Para AGX Orin 64GB: 0955:7023 NVidia Corp

La siguiente imagen es para AGX Orin 32GB:

Flashear a Jetson

Paso 1: Extrae el archivo de imagen descargado:

cd <path-to-image>
sudo tar xpf mfi_xxxx.tar.gz
# For example: sudo tar xpf mfi_recomputer-robo-agx-orin-32g-j501-6.2.1-36.4.4-2026-02-11.tar.gz

Paso 2: Ejecuta el siguiente comando para flashear el sistema JetPack en el SSD NVMe:

cd mfi_xxxx
# For example: cd mfi_recomputer-robo-agx-orin-j501x
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --flash-only --massflash 1 --network usb0 --showlogs

Verás la siguiente salida si el proceso de flasheo se completa correctamente

nota

El comando de flasheo puede tardar entre 2 y 10 minutos.

Paso 3: Conecta la Robotics J501 a una pantalla usando el adaptador PD a HDMI para conectarla a una pantalla que admita entrada HDMI, o conéctala directamente a una pantalla que admita entrada PD usando el cable PD, y completa la configuración inicial:

info

Completa la Configuración del sistema según tus necesidades.

🔌 Uso de interfaces

A continuación se presentarán las distintas interfaces de la placa Robotics J501 y cómo utilizarlas.

M.2 Key M

La J501 incluye dos ranuras M.2 Key M que admiten SSD NVMe PCIe Gen4x4 para expansión de almacenamiento de alta velocidad.

Los SSD compatibles son los siguientes

Conexión de hardware

Instrucciones de uso

Abre la terminal en el dispositivo Jetson e introduce el siguiente comando para probar la velocidad de lectura y escritura del SSD.

Paso 1. Crea el directorio y archivo de prueba:

mkdir ssd
touch ~/ssd/test

Paso 2. Prueba el rendimiento de escritura:

dd if=/dev/zero of=/home/$USER/ssd/test bs=1024M count=5 conv=fdatasync

Paso 3. Comprueba la información del SSD:

nvme list
peligro

Ejecuta el comando sudo rm /home/$USER/ssd/test para eliminar los archivos de caché después de completar la prueba.

M.2 Key E (WiFi/BT)

La ranura M.2 Key E admite módulos Wi‑Fi 6 y Bluetooth 5.x para conectividad inalámbrica.

Conexión de hardware

tip

Nota: Antes de usar la interfaz, debes retirar los tornillos de la carcasa e instalar el módulo correspondiente como se muestra en la figura siguiente.

Instrucciones de uso

Prueba de rendimiento: Para probar el rendimiento de Wi‑Fi, utiliza el siguiente comando (sustituye la dirección IP por la de tu servidor de pruebas):

# On server: iperf3 -s
# On client:
iperf3 -c 192.168.7.157

La funcionalidad Bluetooth está disponible a través de la ranura M.2 Key E. Prueba de Bluetooth:

M.2 Key B (Módulo 4G/5G)

La ranura M.2 Key B admite módulos celulares 4G/5G con soporte para tarjeta Nano SIM.

Conexión de hardware

tip

Nota: Antes de usar la interfaz, debes retirar los tornillos de la carcasa e instalar el módulo correspondiente como se muestra en la figura siguiente.

Instrucciones de uso

Paso 1. Comprobar el reconocimiento de hardware

lsusb 

Este comando muestra una lista de todos los dispositivos USB conectados al sistema, junto con su fabricante (ID), tipo y otra información. Por ejemplo, la salida podría mostrar un dispositivo de Quectel Wireless Solutions Co., Ltd. EM12-G, lo que indica que el módulo 5G está presente.

Paso 2. Confirmar la carga del controlador Es esencial asegurarse de que el controlador option, que se requiere para el módulo 5G, esté cargado. Podemos usar el comando lsmod para comprobarlo.

lsmod | grep option 

Si el controlador option se carga correctamente, se mostrará en la salida la información relevante sobre el controlador.

Paso 3. Configurar ModemManager ModemManager es una herramienta para gestionar dispositivos módem, y debe instalarse y reiniciarse.

sudo apt install modemmanager 
sudo systemctl restart ModemManager

El comando apt install se utiliza para instalar el paquete ModemManager, mientras que systemctl restart reinicia el servicio ModemManager para asegurarse de que la nueva configuración surta efecto.

Paso 4. Verificar la identificación del módulo Podemos usar el comando mmcli -L para comprobar si ModemManager puede identificar correctamente el módulo 5G.

mmcli -L 

Si se reconoce el módulo 5G, se mostrará una salida similar a /org/freedesktop/ModemManager1/Modem/0, lo que indica la ruta al dispositivo módem detectado.

Paso 5. Configurar el APN El APN (Access Point Name) es crucial para conectar un dispositivo móvil a la red. Usaremos el comando nmcli para crear un perfil de portador. Tomando como ejemplo China Mobile, podemos crear un archivo de configuración con los siguientes comandos:

sudo nmcli con add type gsm ifname "*" apn "CMNET" ipv4.method  auto 

Este comando añade una nueva conexión de tipo GSM (Global System for Mobile Communications), especificando el APN como "CMNET" y utilizando configuración IPv4 automática.

Paso 6. Activar la conexión Después de crear el perfil de portador, necesitamos activar la conexión.

sudo nmcli con up "gsm" 

Este comando activa la conexión GSM y, si tiene éxito, se mostrará un mensaje de confirmación.

Paso 7. Volver a verificar la identificación del módulo Ejecuta de nuevo el comando mmcli -L para asegurarte de que el módulo sigue siendo reconocido después de configurar el APN.

mmcli -L 

Paso 8. Comprobar el estado del módulo Por último, podemos usar el comando mmcli -m 0 para ver información detallada sobre el módulo, como la asignación de IP, el operador y el estado de la conexión de red.

mmcli -m 0 

Este comando proporciona detalles completos sobre el módulo 5G, incluido su fabricante, modelo, tecnologías de red compatibles y actuales, estado del dispositivo y operadores de red conectados.

Ethernet

La Robotics J501 proporciona 1x 10GbE (nativo) y 4x 1GbE (mediante switch PCIe) con puertos RJ45. El puerto 10GbE incorpora el PHY TI TQSPH-10G, que admite cinco velocidades: 10/5/2.5/1/0.1 GbE. Los puertos 1GbE admiten velocidades de 10/100/1000M.

Indicadores LED por puerto:

  • LED verde: ENCENDIDO para enlace 10G/5G/2.5G/1000M
  • LED amarillo: Parpadea para la actividad de red

Para probar la velocidad del puerto Ethernet, usa iperf3 de la siguiente manera:

iperf3 -c <server_ip> -B <bind_ip>
info

<server_ip> es la dirección IP del servidor iperf3. El cliente se conectará a este servidor para realizar una prueba de ancho de banda. <bind_ip> vincula la dirección IP local especificada como origen del tráfico de prueba.

LED

El J501 incluye varios LED de estado:

  • LED PWR: Estado de alimentación (verde)
  • LED ACT: Actividad del sistema (amarillo)
  • LED USR: Controlado mediante GPIO

Instrucciones de uso

Lo siguiente muestra cómo controlar los LED USER para que sean verdes, rojos o azules.

#change to red
echo 1 | sudo tee /sys/class/leds/on-board:red/brightness
echo 0 | sudo tee /sys/class/leds/on-board:red/brightness
#change to green
echo 1 | sudo tee /sys/class/leds/on-board:green/brightness
echo 0 | sudo tee /sys/class/leds/on-board:green/brightness

#change to blue
echo 1 | sudo tee /sys/class/leds/on-board:blue/brightness
echo 0 | sudo tee /sys/class/leds/on-board:blue/brightness

El efecto del control del LED se muestra en la siguiente figura:

USB

El Robotics J501 proporciona 4 puertos USB 3.2 Tipo A (a través de un hub interno USB 3.1 Gen1, que admite tasas de datos de hasta 5Gbps para conectar periféricos de alta velocidad, dispositivos de almacenamiento o cámaras) y 1 puerto de depuración USB 2.0 Tipo C (que funciona como una consola serie para acceder a registros del sistema, depurar problemas de arranque y realizar actualizaciones de firmware).

Prueba de velocidad USB-A

Crea un script para probar la velocidad del dispositivo USB:

vim test_usb.sh

Pega el siguiente contenido:

test_usb.sh
cat <<'EOF' | sudo tee test_usb.sh >/dev/null
#!/bin/bash
set -e

MOUNT_POINT="$1"
TEST_FILE="$MOUNT_POINT/test_usb_speed.bin"

if [ -z "$MOUNT_POINT" ]; then
echo "Usage: $0 <mount_point>"
echo "Example: $0 /media/seeed/USB"
exit 1
fi

if [ ! -d "$MOUNT_POINT" ]; then
echo "Error: $MOUNT_POINT is not a directory"
exit 1
fi

echo "Write test..."
dd if=/dev/zero of="$TEST_FILE" bs=1M count=2048 conv=fdatasync status=progress

echo
echo "Drop caches..."
sync
echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null

echo "Read test..."
dd if="$TEST_FILE" of=/dev/null bs=1M count=2048 status=progress

echo
echo "Cleaning up..."
rm -f "$TEST_FILE"
EOF

Haz que el script sea ejecutable y pruébalo:

sudo chmod +x test_usb.sh
./test_usb.sh /mnt # If your USB drive is mounted at /mnt
# Or
./test_usb.sh /media/usb # If your USB drive is mounted at /media/usb
# Or
./test_usb.sh /path/to/your/usb/mount_point
nota

Primero confirma el punto de montaje real de tu dispositivo USB usando el comando df -h o lsblk.

Puerto USB 2.0 Tipo C

Usando este puerto serie, a través del cable de datos USB-C, puedes monitorizar en el PC la información de depuración de entrada y salida.

Paso 1. Abre la herramienta de puerto serie (aquí usamos la herramienta MobaXterm como ejemplo) y crea una nueva sesión.

Paso 2. Selecciona la herramienta Serial.

Paso 3. Selecciona el puerto serie correspondiente, establece la velocidad en baudios a 115200 y haz clic en "OK".

Paso 4. Inicia sesión en tu reComputer Super con el nombre de usuario y la contraseña.

Ventilador

El Robotics J501 proporciona dos conectores de ventilador PWM de 4 pines diseñados para refrigerar tanto el módulo Jetson como los componentes de la placa portadora:

  • Ventilador de 12V: conector de 2,54 mm, máximo 1,5A, adecuado para refrigeración de alto rendimiento
  • Ventilador de 5V: conector JST de 1,25 mm, máximo 1,5A, ideal para refrigeración silenciosa de baja potencia

El control PWM permite un ajuste dinámico y preciso de la velocidad en función de la temperatura del sistema, lo que posibilita una refrigeración eficiente minimizando el ruido y el consumo de energía.

Distribución de pines del ventilador de 12V:

El conector del ventilador de 12V (2,54 mm) tiene la siguiente distribución de pines:

Instrucciones de uso

Control PWM manual:

# Set fan speed (0-255)
sudo -i
echo 200 > /sys/bus/platform/devices/pwm-fan/hwmon/hwmon1/pwm1
nota

La política térmica predeterminada está preconfigurada en /etc/nvpmodel.conf. Para perfiles personalizados, consulta la Guía de desarrollo de NVIDIA Jetson Linux.

Además, podemos establecer manualmente la velocidad del ventilador usando la herramienta jtop.

Puedes introducir el siguiente comando en la terminal para instalar jtop.

sudo apt update
sudo apt install python3-pip -y
sudo pip3 install jetson-stats

Luego reinicia tu reComputer Mini:

sudo reboot

Después de instalar jtop, puedes lanzarlo en la terminal:

jtop

CAN

El reComputer Robotics J501 está equipado con 4 interfaces CAN independientes (CAN 0, CAN 1, CAN 2, CAN 3), que comparten el conector J25 2x10P con las interfaces DI/DO. Estas interfaces admiten tanto los protocolos de comunicación Classic CAN como CAN FD, y cuentan con un alto rendimiento antiinterferencias y transmisión de datos en tiempo real, lo que las hace adecuadas para escenarios de control industrial como electrónica automotriz, automatización industrial y robótica.

Instrucciones de uso

Este es el diagrama esquemático de la interfaz CAN.

Comunicación CAN

Esta sección muestra la conexión CAN0↔CAN1 y CAN2↔CAN3 en el Jetson y cómo enviar y recibir datos entre esos pares tanto en modo Classic CAN como en modo CAN‑FD.

Nombre del canalTipo de interfazNombre del pinChip GPIONúmero GPIOControl de resistencia de terminación
CAN0NativaPAA.04gpiochip14gpiochip1 line4 (PAA.04)
CAN1NativaPAA.07gpiochip17gpiochip1 line7 (PAA.07)
CAN2SPI-a-CAN-gpiochip210gpiochip2 line10
CAN3SPI-a-CAN-gpiochip212gpiochip2 line12

Las resistencias de terminación para CAN0 y CAN1 se pueden controlar mediante dos pines: PAA.04, ubicado en gpiochip1 line4, y PAA.07, ubicado en gpiochip1 line7.

El control de la resistencia de terminación sigue estas reglas:

When `PAA.04 = 1`, the 120 Ω termination resistor of CAN0 is **disconnected**;  
when `PAA.04 = 0`, the 120 Ω termination resistor of CAN0 is **connected**.

When `PAA.07 = 1`, the 120 Ω termination resistor of CAN1 is **disconnected**;
when `PAA.07 = 0`, the 120 Ω termination resistor of CAN1 is **connected**.

Introduce el siguiente comando para ver los pines en gpiochip 1:

gpioinfo gpiochip1

Consulta los siguientes comandos para establecer PAA.04 y PAA.07 en 0:

sudo gpioset --mode=wait gpiochip1 4=0
sudo gpioset --mode=wait gpiochip1 7=0

Consulta los siguientes comandos para establecer PAA.04 y PAA.07 en 1:

sudo gpioset --mode=wait gpiochip1 4=1
sudo gpioset --mode=wait gpiochip1 7=1

Modo Classic CAN

El siguiente script implementa pruebas de comunicación en bucle entre CAN0/CAN1 y CAN2/CAN3, incluyendo la activación de la resistencia terminal, la configuración de la velocidad de bits y la transmisión bidireccional de datos.

El diagrama de cableado se muestra a continuación:

DesdeHacia
CAN0_HCAN1_H
CAN0_LCAN1_L
CAN2_HCAN3_H
CAN2_LCAN3_L

El diagrama de cableado se muestra a continuación:

Crea test_can.sh para probar la transmisión y recepción de datos entre CAN0↔CAN1 y CAN2↔CAN3 en modo estándar:

touch test_can.sh
sudo chmod +x test_can.sh
sudo ./test_can.sh

El código del script para test_can.sh es el siguiente:

test_can.sh
#!/bin/bash
set -e

PW="000000"

echo "$PW" | sudo -S ip link set can0 down || true
echo "$PW" | sudo -S ip link set can1 down || true
echo "$PW" | sudo -S ip link set can2 down || true
echo "$PW" | sudo -S ip link set can3 down || true

# Set socket buffer sizes
echo "$PW" | sudo -S sysctl -w net.core.rmem_max=524288
echo "$PW" | sudo -S sysctl -w net.core.wmem_max=524288
echo "$PW" | sudo -S sysctl -w net.core.rmem_default=524288
echo "$PW" | sudo -S sysctl -w net.core.wmem_default=524288

# Set bitrate, 1 Mbps
BITRATE=1000000
echo "$PW" | sudo -S ip link set can0 type can bitrate ${BITRATE}
echo "$PW" | sudo -S ip link set can1 type can bitrate ${BITRATE}
echo "$PW" | sudo -S ip link set can0 up
echo "$PW" | sudo -S ip link set can1 up

echo "$PW" | sudo -S ip link set can2 type can bitrate ${BITRATE}
echo "$PW" | sudo -S ip link set can3 type can bitrate ${BITRATE}
echo "$PW" | sudo -S ip link set can2 up
echo "$PW" | sudo -S ip link set can3 up

sleep 1

# Enable termination resistors
sudo pkill -f gpioset || true
gpioset --mode=time --sec=200000 gpiochip2 8=0 & # enable CAN1 120R
GPIO1_PID=$!
gpioset --mode=time --sec=200000 gpiochip2 9=0 & # enable CAN0 120R
GPIO2_PID=$!
gpioset --mode=time --sec=200000 gpiochip2 12=0 & # enable CAN3 120R
GPIO3_PID=$!
gpioset --mode=time --sec=200000 gpiochip2 10=0 & # enable CAN2 120R
GPIO4_PID=$!

echo "Start candump on can0 & can1..."
candump can0 &
DUMP0_PID=$!
candump can1 &
DUMP1_PID=$!

echo "Start candump on can2 & can3..."
candump can2 &
DUMP2_PID=$!
candump can3 &
DUMP3_PID=$!

echo "Start cangen on can0 & can1 and can2 & can3 (bi-directional test)..."
# -g 10 sends one frame every 10 ms; adjust as needed
cangen can0 -g 10 &
GEN0_PID=$!
cangen can1 -g 10 &
GEN1_PID=$!
cangen can2 -g 10 &
GEN2_PID=$!
cangen can3 -g 10 &
GEN3_PID=$!

# Cleanup background processes on Ctrl+C
cleanup() {
echo
echo "Stopping CAN test..."
kill $GEN0_PID $GEN1_PID $DUMP0_PID $DUMP1_PID $GPIO1_PID $GPIO2_PID 2>/dev/null || true
kill $GEN2_PID $GEN3_PID $DUMP2_PID $DUMP3_PID $GPIO3_PID $GPIO4_PID 2>/dev/null || true
echo "$PW" | sudo -S ip link set can0 down || true
echo "$PW" | sudo -S ip link set can1 down || true
echo "$PW" | sudo -S ip link set can2 down || true
echo "$PW" | sudo -S ip link set can3 down || true
echo "Done."
}
trap cleanup INT TERM

# Wait for child processes (candump runs until you Ctrl+C)
wait
nota

En el script de prueba CAN, reemplaza PW con tu propia contraseña de Jetson.

Se completará la transmisión y recepción de datos entre CAN0 y CAN1:

Modo CAN-FD

CAN FD admite mayores tasas de transmisión de datos y longitudes de trama de datos más grandes. El siguiente script implementa una prueba de bucle de retorno CAN FD.

Crea test_canfd.sh para probar la transmisión y recepción de datos entre CAN0↔CAN1 y CAN2↔CAN3 en modo CAN-FD:

touch test_canfd.sh
sudo chmod +x test_canfd.sh
sudo ./test_canfd.sh

El código del script para test_canfd.sh es el siguiente:

test_canfd.sh
#!/bin/bash
set -e

PW="000000"

echo "$PW" | sudo -S ip link set can0 down || true
echo "$PW" | sudo -S ip link set can1 down || true
echo "$PW" | sudo -S ip link set can2 down || true
echo "$PW" | sudo -S ip link set can3 down || true

# Set socket buffers
echo "$PW" | sudo -S sysctl -w net.core.rmem_max=524288
echo "$PW" | sudo -S sysctl -w net.core.wmem_max=524288
echo "$PW" | sudo -S sysctl -w net.core.rmem_default=524288
echo "$PW" | sudo -S sysctl -w net.core.wmem_default=524288

# ---- CAN-FD parameters ----
BITRATE=500000 # Arbitration (nominal) bitrate
DBITRATE=5000000 # Data phase bitrate (FD fast mode)

# Configure CAN-FD: arbitration bitrate + data bitrate + FD on + error reporting + auto restart
echo "$PW" | sudo -S ip link set can0 type can bitrate $BITRATE dbitrate $DBITRATE fd on berr-reporting on restart-ms 100
echo "$PW" | sudo -S ip link set can1 type can bitrate $BITRATE dbitrate $DBITRATE fd on berr-reporting on restart-ms 100
echo "$PW" | sudo -S ip link set can2 type can bitrate $BITRATE dbitrate $DBITRATE fd on berr-reporting on restart-ms 100
echo "$PW" | sudo -S ip link set can3 type can bitrate $BITRATE dbitrate $DBITRATE fd on berr-reporting on restart-ms 100

echo "$PW" | sudo -S ip link set can0 up
echo "$PW" | sudo -S ip link set can1 up
echo "$PW" | sudo -S ip link set can2 up
echo "$PW" | sudo -S ip link set can3 up

sleep 1

# Enable termination resistors
sudo pkill -f gpioset || true
gpioset --mode=time --sec=200000 gpiochip2 8=0 & # enable CAN1 120R
GPIO1_PID=$!
gpioset --mode=time --sec=200000 gpiochip2 9=0 & # enable CAN0 120R
GPIO2_PID=$!
gpioset --mode=time --sec=200000 gpiochip2 12=0 & # enable CAN3 120R
GPIO3_PID=$!
gpioset --mode=time --sec=200000 gpiochip2 10=0 & # enable CAN2 120R
GPIO4_PID=$!

echo "Start candump on can0 & can1..."
candump can0 &
DUMP0_PID=$!
candump can1 &
DUMP1_PID=$!

echo "Start candump on can2 & can3..."
candump can2 &
DUMP2_PID=$!
candump can3 &
DUMP3_PID=$!

echo "Start cangen on can0 & can1 and can2 & can3 (bi-directional test)..."
# -g 10 sends one frame every 10 ms; adjust as needed
cangen can0 -g 10 &
GEN0_PID=$!
cangen can1 -g 10 &
GEN1_PID=$!
cangen can2 -g 10 &
GEN2_PID=$!
cangen can3 -g 10 &
GEN3_PID=$!

# Cleanup background processes on Ctrl+C
cleanup() {
echo
echo "Stopping CAN-FD test..."
kill $GEN0_PID $GEN1_PID $DUMP0_PID $DUMP1_PID $GPIO1_PID $GPIO2_PID 2>/dev/null || true
kill $GEN2_PID $GEN3_PID $DUMP2_PID $DUMP3_PID $GPIO3_PID $GPIO4_PID 2>/dev/null || true
echo "$PW" | sudo -S ip link set can0 down || true
echo "$PW" | sudo -S ip link set can1 down || true
echo "$PW" | sudo -S ip link set can2 down || true
echo "$PW" | sudo -S ip link set can3 down || true
echo "Done."
}
trap cleanup INT TERM

# Wait for child processes (candump will run until you Ctrl+C)
wait
nota

En el script de prueba CAN, reemplaza PW con tu propia contraseña de Jetson.

Se completará la transmisión y recepción de datos entre CAN0↔CAN1 y CAN2↔CAN3:

DI/DO

Las interfaces DI/DO de reComputer Robotics J501 están integradas en el conector J25 2x10P, compartiendo la interfaz con las interfaces CAN. Admiten 4 canales de entrada digital y 4 canales de salida digital, con transmisión de señal estable y adaptación de voltaje de grado industrial, adecuadas para conectar sensores digitales, relés y otros dispositivos periféricos.

Conexión de hardware

Canales de entrada digital (DI)

Nombre del canalCaracterísticas de voltajeEtiqueta GPIONombre de pinChip GPIONúmero GPIO
DI_12V_1Entrada adaptable de 12VDI_1_GPIO17PP.04gpiochip096
DI_12V_2Entrada adaptable de 12VDI_1_GPIO18PQ.04gpiochip0104
DI_12V_3Entrada adaptable de 12VDI_1_GPIO19PN.02gpiochip086
DI_12V_4Entrada adaptable de 12VDI_1_GPIO33PM.07gpiochip083

Canales de salida digital (DO)

Nombre del canalCaracterísticas de voltajeEtiqueta GPIONombre de pinChip GPIONúmero GPIOInformación adicional
DO_40V_1Salida de drenador abierto; ~0V (bajo) cuando no está tirado a alto, 12V (alto) cuando está tirado a altoDO_1_GPIOPAA.04gpiochip14Número correspondiente: 320
DO_40V_2Salida de drenador abierto; ~0V (bajo) cuando no está tirado a alto, 12V (alto) cuando está tirado a altoDO_2_GPIOPAA.07gpiochip17Número correspondiente: 323
DO_40V_3Salida de drenador abierto; ~0V (bajo) cuando no está tirado a alto, 12V (alto) cuando está tirado a altoDO_3_GPIOPBB.01gpiochip19Número correspondiente: 325
DO_40V_4Salida de drenador abierto; ~0V (bajo) cuando no está tirado a alto, 12V (alto) cuando está tirado a altoDO_4_GPIOPBB.00gpiochip18Número correspondiente: 324

Las definiciones de pines clave para las interfaces DI/DO en el conector J25 son las siguientes (la numeración de pines corresponde al conector físico):

Número de pinEtiqueta de funciónDescripción
1DI_12V_1Canal de entrada digital de 12V 1
3DI_12V_2Canal de entrada digital de 12V 2
5DI_12V_3Canal de entrada digital de 12V 3
7DI_12V_4Canal de entrada digital de 12V 4
9GND_DITierra para canales de entrada digital
2DO_40V_1Canal de salida digital de 40V 1
4DO_40V_2Canal de salida digital de 40V 2
6DO_40V_3Canal de salida digital de 40V 3
8DO_40V_4Canal de salida digital de 40V 4
10GND_DOTierra para canales de salida digital
nota

Para el pinout completo (incluidas las interfaces CAN), consulta la documentación de hardware de reComputer Robotics J501 para evitar conexiones incorrectas.

Instrucciones de uso

Operación de salida digital (DO)

Las interfaces DO adoptan salida de drenador abierto. Puedes configurar el nivel de salida (alto/bajo) mediante comandos para controlar periféricos como relés y LED.

Ejecuta el siguiente comando para habilitar el canal DO (salida de 12V, alimentado por la resistencia de pull-up externa y la fuente de alimentación de 12V):

# Enable DO_40V_1 (gpiochip1 4)
sudo gpioset --mode=wait 1 4=1

# Enable DO_40V_2 (gpiochip1 7)
sudo gpioset --mode=wait 1 7=1

# Enable DO_40V_3 (gpiochip1 9)
sudo gpioset --mode=wait 1 9=1

# Enable DO_40V_4 (gpiochip1 8)
sudo gpioset --mode=wait 1 8=1

DO antes de tirar a alto:

DO después de tirar a alto:

Ejecuta el siguiente comando para deshabilitar el canal DO (salida ~0V):

# Disable DO_40V_1 (gpiochip1 4)
sudo gpioset --mode=wait 1 4=0

# Disable DO_40V_2 (gpiochip1 7)
sudo gpioset --mode=wait 1 7=0

# Disable DO_40V_3 (gpiochip1 9)
sudo gpioset --mode=wait 1 9=0

# Disable DO_40V_4 (gpiochip1 8)
sudo gpioset --mode=wait 1 8=0

Operación de entrada digital (DI)

Utiliza el comando gpioget para leer el nivel de entrada del canal DI (valor de retorno 1 = nivel alto, 0 = nivel bajo) y obtener el estado de los dispositivos periféricos.

El comando para leer el nivel del canal DI es el siguiente:

# Read DI_12V_1 (gpiochip0 96) status
gpioget gpiochip0 96

# Read DI_12V_2 (gpiochip0 104) status
gpioget gpiochip0 104

# Read DI_12V_3 (gpiochip0 86) status
gpioget gpiochip0 86

# Read DI_12V_4 (gpiochip0 83) status
gpioget gpiochip0 83

SPI

Conexión de hardware

Instrucciones de uso

Utiliza cables Dupont para conectar los pines centrales del canal SPI de destino (toma /dev/spidev2.0 como ejemplo): Conecta el pin MOSI de SPI2.0 a su pin MISO (realiza transmisión/recepción de datos en bucle de retorno).

El diagrama de cableado es el siguiente:

nota

Para usar SPI, retira la tapa lateral del dispositivo con un destornillador como se muestra arriba.

Paso 1: Cargar el módulo del kernel SPI (prerrequisito) Antes de operar la interfaz SPI, asegúrate de que el módulo del kernel spidev esté cargado (el sistema predeterminado puede precargarlo, pero se recomienda verificarlo manualmente):

sudo modprobe spidev
nota

Si el comando se ejecuta sin mensajes de error, significa que el módulo se cargó correctamente; si el módulo ya está cargado, el comando no devolverá ninguna información, lo cual es un fenómeno normal.

Paso 2: Ver nodos de dispositivo SPI Introduce el siguiente comando en la terminal para ver el nombre de dispositivo asignado por la interfaz SPI de reComputer Robotics J501:

ls /dev/spidev*

Si no se muestra ningún nodo de dispositivo, significa que el módulo spidev no se ha cargado correctamente. Vuelve a ejecutar sudo modprobe spidev y revisa el registro del sistema para la resolución de problemas.

Paso 3: Obtener y compilar el código de prueba SPI Obtén el código de prueba spidev-test desde GitHub y compílalo:

git clone https://github.com/rm-hull/spidev-test
cd spidev-test
gcc spidev_test.c -o spidev_test

Paso 4: Ejecutar el programa de prueba SPI Introduce el siguiente comando en la terminal para ejecutar el programa de prueba SPI (tomando /dev/spidev2.0 como ejemplo):

sudo ./spidev_test -v -D /dev/spidev2.0 -s 100000

Paso 5: Verificar el resultado de la prueba Después de ejecutar el comando de prueba, puedes observar en la terminal el estado de transmisión y recepción de datos de la interfaz SPI2.0. La salida principal es la siguiente:

Criterio clave de evaluación: Los datos TX (transmitidos) son consistentes con los datos RX (recibidos), lo que indica que la prueba de bucle cerrado SPI se ha realizado correctamente y que la función de la interfaz SPI es normal.

UART

El reComputer Robotics J501 está equipado con 2 interfaces UART independientes (UART1 y UART2) que admiten modos de comunicación RS232, RS422 y RS485, con transmisión de señal estable y amplia compatibilidad con dispositivos periféricos.

Conexión de hardware

Canales de la interfaz UART

Nombre del canalNodo de dispositivoModos compatiblesVelocidad en baudios predeterminadaComando de habilitación GPIOMétodo de cambio de modo
UART1 (DB9-1)/dev/ttyTHS1RS232, RS422, RS485RS232: 115200 bps; RS422/RS485: 9600 bpsgpioset --mode=wait gpiochip0 2=0Interruptor DIP SW3 (DIP de 8 pines)
UART2 (DB9-2)/dev/ttyTHS4RS232 (predeterminado)115200 bpsgpioset --mode=wait gpiochip2 15=0RS232 fijo (sin conmutación)

Definición de pines (conector DB9)

La función de cada pin DB9 varía según el modo de comunicación. Consulta la siguiente tabla para realizar un cableado correcto (la numeración de pines sigue las especificaciones estándar del conector DB9 macho):

Número de pin DB9Función en modo RS232Función en modo RS422Función en modo RS485
1-TXD- (Transmit Data-)Data- (Differential Data-)
2RXD (Receive Data)TXD+ (Transmit Data+)Data+ (Differential Data+)
3TXD (Transmit Data)RXD+ (Receive Data+)-
4-RXD- (Receive Data-)-
5GND (Ground)GND (Ground)GND (Ground)
6---
7RTS (Request to Send)--
8CTS (Clear to Send)--
9---

Configuración de modo (interruptor DIP SW3)

Solo UART1 (DB9-1) admite el cambio de modo mediante el interruptor DIP SW3 (UART2 está fijado en RS232). El interruptor es de tipo DIP de 8 pines, con los pines de configuración principales etiquetados como MODE_0, MODE_1 y MODE_2 en el esquema.

La interfaz se muestra en la siguiente figura:

Reglas de configuración

Modo de trabajoCombinación del interruptor DIP (MODE_2, MODE_1, MODE_0)Operación del estado del interruptor
RS2320 (OFF), 0 (OFF), 1 (ON)MODE_0: cambiar a ON; MODE_1/MODE_2: mantener en OFF
RS4220 (OFF), 0 (OFF), 0 (OFF) o 1 (ON), 0 (OFF), 0 (OFF)MODE_0/MODE_1: mantener en OFF; MODE_2: opcional (ON/OFF)
RS4850 (OFF), 1 (ON), 0 (OFF) o 1 (ON), 1 (ON), 0 (OFF)MODE_1: cambiar a ON; MODE_0/MODE_2: opcional (ON/OFF)
nota

Después de completar la conexión de hardware, utiliza un software de terminal (por ejemplo, CuteCom) para probar la función de comunicación UART. Si CuteCom no está instalado, ejecuta sudo apt-get install cutecom para instalarlo. Asegúrate de que el canal UART se haya habilitado mediante el comando GPIO.

Instrucciones de uso

Comandos de habilitación GPIO

Antes de conectar, ejecuta el comando de habilitación GPIO en la terminal para activar el canal UART correspondiente:

# Enable UART1 (ttyTHS1)
sudo gpioset --mode=wait gpiochip0 2=0

# Enable UART2 (ttyTHS4)
sudo gpioset --mode=wait gpiochip2 15=0

Prueba en modo RS232

Aquí puedes utilizar un adaptador USB a RS232 para probar la interfaz. Hemos utilizado el Adaptador UGREEN USB a RS232 para nuestras pruebas.

El diagrama de cableado se muestra a continuación:

Paso 1: Iniciar CuteCom Ejecuta sudo cutecom para iniciar el software de terminal CuteCom.

Paso 2: Configurar los parámetros del puerto serie Configura el puerto serie con los siguientes parámetros:

  • Dispositivo: /dev/ttyTHS1 (UART1) o /dev/ttyTHS4 (UART2)
  • Velocidad en baudios: 115200 bps
  • Bits de datos: 8, Paridad: Ninguna, Bits de parada: 1, Control de flujo: Ninguno

Paso 3: Abrir el puerto serie Haz clic en "Open Device" para abrir el puerto serie.

Paso 4: Enviar datos de prueba Envía datos de prueba (por ejemplo, "232 test from jetson") y verifica la recepción de datos desde el dispositivo periférico.

Prueba en modo RS485

Aquí puedes utilizar un adaptador USB a RS485 para probar la interfaz. Hemos utilizado el Adaptador DTech USB a RS485 para nuestras pruebas.

El diagrama de cableado se muestra a continuación:

Paso 1: Iniciar CuteCom Ejecuta sudo cutecom para iniciar el software de terminal CuteCom.

Paso 2: Configurar los parámetros del puerto serie Configura el puerto serie con los siguientes parámetros:

  • Dispositivo: /dev/ttyTHS1
  • Velocidad en baudios: 9600 bps
  • Bits de datos: 8, Paridad: Ninguna, Bits de parada: 1, Control de flujo: Ninguno

Paso 3: Abrir el puerto serie Haz clic en "Open Device" para abrir el puerto serie.

Paso 4: Enviar datos de prueba Envía datos de prueba (por ejemplo, "485 test from jetson") y verifica la recepción de datos desde el dispositivo periférico.

Prueba en modo RS422

Aquí puedes utilizar un adaptador USB a RS422 para probar la interfaz. Hemos utilizado el Adaptador DTech USB a RS485 para nuestras pruebas.

El diagrama de cableado se muestra a continuación:

Paso 1: Iniciar CuteCom Ejecuta sudo cutecom para iniciar el software de terminal CuteCom.

Paso 2: Configurar los parámetros del puerto serie Configura el puerto serie con los siguientes parámetros:

  • Dispositivo: /dev/ttyTHS1
  • Velocidad en baudios: 9600 bps
  • Bits de datos: 8, Paridad: Ninguna, Bits de parada: 1, Control de flujo: Ninguno

Paso 3: Abrir el puerto serie Haz clic en "Open Device" para abrir el puerto serie.

Paso 4: Enviar datos de prueba Envía datos de prueba (por ejemplo, "422 test from jetson") y verifica la recepción de datos desde el dispositivo periférico.

RTC

El reComputer Robotics J501 incluye un RTC de hardware con batería de respaldo para un cronometraje preciso. Hay dos formas de proporcionar alimentación de respaldo al RTC:

  1. Usar el portapilas para batería tipo moneda CR1220 (J14)
  2. Usar el conector RTC de 2 pines - J4 para conexión de alimentación externa

Conexión de hardware

Método 1: Usar el portapilas para batería tipo moneda CR1220

Conecta una batería tipo moneda CR1220 de 3 V al zócalo RTC de la placa como se muestra a continuación. Asegúrate de que el extremo positivo (+) de la batería esté orientado hacia arriba.

Método 2: Usar el conector RTC de 2 pines

El conector RTC de 2 pines proporciona una forma alternativa de conectar alimentación externa al RTC.

Instrucciones de uso

Paso 1. Conecta una batería RTC como se mencionó anteriormente.

Paso 2. Enciende el reComputer Robotics J501.

Paso 3. En el escritorio de Ubuntu, haz clic en el menú desplegable en la esquina superior derecha, navega a Settings > Date & Time, conéctate a una red mediante un cable Ethernet y selecciona Automatic Date & Time para obtener la fecha y hora automáticamente.

nota

Si no te has conectado a internet mediante Ethernet, puedes configurar la fecha y hora manualmente aquí.

Paso 4. Abre una ventana de terminal y ejecuta el siguiente comando para comprobar la hora del reloj de hardware:

cat /sys/devices/platform/bpmp/bpmp\:i2c/i2c-4/4-003c/nvvrs-pseq-rtc/rtc/rtc0/time

Paso 5. Desconecta la conexión de red y reinicia el dispositivo. Verás que la hora del sistema ha perdido la alimentación pero sigue funcionando con normalidad.

Pantalla

El Robotics J501 está equipado con un HDMI para salida de pantalla de alta resolución.

Puerto de expansión

La placa portadora Robotics J501 cuenta con un encabezado de expansión de cámara para la placa de expansión GMSL. Puede conectar y operar simultáneamente cuatro cámaras GMSL al mismo tiempo.

Conexión de hardware

A continuación se muestra la ranura de conexión de la placa de expansión de cámara GMSL de la placa portadora Robotics J501 (es necesario preparar una placa de expansión con antelación):

A continuación se muestran los modelos de cámaras GMSL que ya hemos soportado:

Instrucciones de uso

nota

Antes de habilitar la funcionalidad GMSL, asegúrate de haber instalado una versión de JetPack con el controlador de la placa de expansión GMSL.

Configurar el archivo Jetson IO

sudo /opt/nvidia/jetson-io/jetson-io.py
nota

En total hay tres archivos de superposición, a saber, Seeed GMSL 1X4 3G, Seeed GMSL 1X4 6G, Seeed GMSL 1X4 y Orbbec Gemini 335Lg. Estos corresponden respectivamente a la cámara 3G de SG3S, la cámara 6G de SG2 y SG8S, y la cámara de Orbbec. Como se muestra en la Figura 3, configura el archivo io de acuerdo con el modelo de tu cámara.

paso 2. Instala las herramientas de configuración de la interfaz de vídeo.

sudo apt update
sudo apt install v4l-utils wmctrl

Usar las cámaras de la Serie SGxxx

paso 1. Configura el modo de sincronización de fotogramas (¡no está habilitado por defecto!).

info

Aquí demostramos cómo configurar cámaras de diferentes modelos y resoluciones.

#enables frame synchronization
v4l2-ctl -d /dev/video0 --set-ctrl=trig_mode=1
#Set the frame rate of the camera
v4l2-ctl -V --set-fmt-video=width=1920,height=1536 -c sensor_mode=0 --stream-mmap -d /dev/video0
#Set the camera format
v4l2-ctl -V --set-fmt-video=width=1920,height=1536 -c sensor_mode=0 -d /dev/video0
nota

trig_mode = 1 habilita la sincronización de fotogramas, mientras que trig_mode = 0 deshabilita la sincronización de fotogramas. La configuración predeterminada es deshabilitar la sincronización de fotogramas.

--set-fmt-video sigue la resolución que se selecciona en función de la cámara conectada. Actualmente, hay tres opciones de sensor_mode, cada una correspondiente a una resolución diferente.

  • sensor_mode=0 -------> YUYV8_1X16/1920x1536
  • sensor_mode=1 -------> YUYV8_1X16/1920x1080
  • sensor_mode=2 -------> YUYV8_1X16/3840x2160

paso 2. Inicia la cámara.

gst-launch-1.0 \
v4l2src device=/dev/video0 ! \
video/x-raw,format=YUY2,width=1920,height=1080,framerate=30/1 ! \
videoconvert ! \
videoscale ! \
xvimagesink

gst-launch-1.0 \
v4l2src device=/dev/video1 ! \
video/x-raw,format=YUY2,width=1920,height=1080,framerate=30/1 ! \
videoconvert ! \
videoscale ! \
xvimagesink

gst-launch-1.0 \
v4l2src device=/dev/video2 ! \
video/x-raw,format=YUY2,width=1536,height=1080,framerate=30/1 ! \
videoconvert ! \
videoscale ! \
xvimagesink

gst-launch-1.0 \
v4l2src device=/dev/video3 ! \
video/x-raw,format=YUY2,width=3840,height=2160,framerate=30/1 ! \
videoconvert ! \
videoscale ! \
xvimagesink

Recursos

Soporte técnico y debate sobre el producto

Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte para garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.

Loading Comments...