Cómo compilar una red de Thread con SimpleLink F3 de Texas Instruments y OpenThread

1. Introducción

Logotipo de OpenThread

OpenThread (OT) de Google es una implementación de código abierto de Thread. Google lanzó OpenThread para que la tecnología de redes que se usa en los productos Google Nest esté disponible para los desarrolladores, lo que acelera el desarrollo de productos para aplicaciones de hogares conectados y edificios comerciales. Con una capa de abstracción de plataforma estrecha y un espacio en memoria pequeño, OpenThread es altamente portátil. Admite diseños de sistema en chip (SoC) y coprocesador de red (NCP).

La Especificación de Thread define un protocolo de comunicación inalámbrico confiable, seguro y de bajo consumo basado en IPv6 para aplicaciones domésticas y comerciales.

Texas Instruments implementó OpenThread para la familia de dispositivos SimpleLink™ CC27xx. El repositorio ot-ti en GitHub contiene los controladores de la plataforma y las aplicaciones de ejemplo necesarias para ejecutar OpenThread en las MCU conectadas SimpleLink de Texas Instruments. El CC2745R10-Q1 es un MCU inalámbrico IEEE 802.15.4 certificado por Thread y apto para el uso en automóviles (calificado según AEC-Q100) de la familia SimpleLink CC27xx de TI.

En este codelab, se describe cómo comenzar a desarrollar aplicaciones de OpenThread con la placa de evaluación LP-EM-CC2745R10-Q1 LaunchPad y el repositorio ot-ti. En la siguiente imagen, se muestra la configuración de hardware que se usa en este codelab, con un router de borde de OT (OTBR) y dos dispositivos Thread completos (FTD).

Configuración de hardware de CC2745R10

Qué aprenderás

  • Cómo configurar el entorno de compilación de ot-ti de Texas Instruments
  • Cómo compilar y grabar los archivos binarios de la CLI de OpenThread en placas LP-EM-CC2745R10-Q1
  • Cómo configurar una Raspberry Pi como un router de borde de OpenThread (OTBR) con ot-br-posix
  • Cómo crear una red de Thread en el OTBR
  • Puesta en servicio fuera de banda de dispositivos en una red Thread
  • Cómo verificar la comunicación de Thread entre nodos con el comando ping

2. Requisitos previos

Hardware

  1. 3 placas LaunchPad LP-EM-CC2745R10-Q1: Una configurada como RCP conectada al Border Router y dos configuradas como dispositivos Full Thread (FTD). LP-EM-CC2745R10-Q1, vista en ánguloEl CC2745R10-Q1 es un MCU inalámbrico IEEE 802.15.4 certificado por Thread y apto para el uso automotriz (calificado según AEC-Q100) en la familia SimpleLink CC27xx de TI. El LP-EM-CC2745R10-Q1 es el módulo de evaluación LaunchPad correspondiente y admite los roles de RCP, FTD, MTD y NCP de Thread. El CC2340R5 con el LaunchPad LP-EM-CC2340R5 es una opción con menos memoria que puede servir solo como RCP. No admite los roles de FTD, MTD ni NCP. Si sustituyes una LP-EM-CC2340R5 por la placa 1 (RCP), las dos placas FTD deben seguir siendo LP-EM-CC2745R10-Q1.
  2. 3 sondas de depuración LP-XDS110ET: Una por placa LaunchPad, que se usa para la programación y la depuración a través de USB. LP-XDS110ET, vista en ánguloEl LP-XDS110ET es una sonda de depuración USB independiente que se requiere para las LaunchPads con el factor de forma LP-EM. Incluye compatibilidad con EnergyTrace para la generación de perfiles de energía. El LP-XDS110 es una alternativa de menor costo que proporciona la misma capacidad de programación y depuración, pero no incluye EnergyTrace. Como alternativa adicional, se puede usar una LaunchPad con una sonda de depuración XDS110 integrada (como la LAUNCHXL-CC26X2R1) en lugar de la placa LP-EM y una sonda de depuración independiente. Consulta la guía de conectividad de depuración de LaunchPad para obtener más detalles.
  3. 3 cables micro-USB para conectar y alimentar las placas LaunchPad y las sondas de depuración.
  4. Una Raspberry Pi 4B o posterior con Raspberry Pi OS conectada a Internet a través de Ethernet. Se configurará como el host del router de borde de OT.Raspberry Pi 4
  5. Un sistema host Linux o macOS con al menos 2 puertos USB y acceso a Internet El entorno de compilación requiere una shell compatible con Bash. Los usuarios de Windows deben usar WSL2 (Subsistema de Windows para Linux 2) con Ubuntu.
  6. Al menos un cable Ethernet para conectar la Raspberry Pi a Internet Como alternativa, puedes conectar la Raspberry Pi a Wi-Fi y usar wlan0 como la interfaz de infraestructura. Consulta el paso de configuración del OTBR para obtener más detalles.

Software

  • Repositorio TI ot-ti: https://github.com/TexasInstruments/ot-ti
  • GNU ARM Embedded Toolchain 12.2 (se instala automáticamente con la secuencia de comandos de arranque)
  • SysConfig 1.27.0 (se instala automáticamente con la secuencia de comandos de arranque)
  • TI UniFlash: Para grabar firmware en las placas LaunchPad

3. Configuración del hardware

En este codelab, se usan tres placas LP-EM-CC2745R10-Q1:

  • Placa 1 (RCP): Ejecuta el firmware ot-rcp. Se conecta a la Raspberry Pi a través de USB como coprocesador de radio para el router de borde.
  • Placa 2 (FTD 1): Ejecuta el firmware de ot-cli-ftd como un dispositivo Thread completo.
  • Placa 3 (FTD 2): Ejecuta el firmware de ot-cli-ftd como un dispositivo Thread completo.

LP-EM-CC2745R10-Q1, vista superior

Conecta cada LaunchPad a tu computadora host a través de un cable micro-USB. La conexión USB proporciona alimentación y capacidad de depuración o programación a través de la sonda de depuración XDS110 integrada.

Cada LP-EM-CC2745R10-Q1 aparece como dos puertos serie virtuales cuando se conecta a través de USB: uno para la interfaz de depuración XDS110 y otro para el UART de la aplicación. Cuando abras una consola en serie, conéctate al puerto UART de aplicación/usuario, no al puerto de datos auxiliares.

Diagrama de conexión del hardware

4. Configuración y compilación del repositorio

El sistema de compilación ot-ti usa CMake y requiere un shell de Bash. Todos los comandos de esta sección se ejecutan en el host de Linux o macOS (o WSL2 en Windows).

1. Clona el repositorio

$ git clone https://github.com/TexasInstruments/ot-ti.git
$ cd ot-ti
$ git submodule update --init

2. Ejecuta la secuencia de comandos de arranque

La secuencia de comandos de arranque instala las dependencias necesarias, como la cadena de herramientas de GNU ARM y SysConfig:

$ ./script/bootstrap

La secuencia de comandos de arranque requiere cmake, git, wget y herramientas de compilación estándar. En Ubuntu/Debian, instala los requisitos previos con el siguiente comando: sudo apt-get install -y cmake git make wget tar ninja-build

3. Compila el firmware para LP_EM_CC2745R10_Q1

Compila todas las imágenes de firmware para la placa LP-EM-CC2745R10-Q1:

$ ./script/build LP_EM_CC2745R10_Q1

El destino de compilación LP_EM_CC2745R10_Q1 corresponde al dispositivo CC2745R10-Q1 de la familia CC27xx SimpleLink (núcleo Arm Cortex-M33F). Para ver todas las placas compatibles, ejecuta ./script/build sin argumentos.

Después de una compilación exitosa, los archivos binarios ELF se encuentran en build/bin/:

$ ls build/bin/
ot-cli-ftd.out  ot-cli-mtd.out  ot-ncp-ftd.out  ot-rcp.out

Las dos imágenes que se usan en este codelab son las siguientes:

  • ot-rcp.out: Es el firmware del coprocesador de radio para la placa del router de borde.
  • ot-cli-ftd.out: Es el firmware de la CLI del dispositivo Thread completo para las dos placas FTD.

Dispositivo Thread mínimo opcional: Si deseas explorar un dispositivo final inactivo en lugar de un dispositivo Thread completo, puedes escribir ot-cli-mtd.out en lugar de ot-cli-ftd.out en las placas 2 y 3. Un MTD no enruta el tráfico de Thread y puede entrar en estados de suspensión de bajo consumo, lo que lo hace adecuado para aplicaciones con batería. Los pasos de formación de la red de Thread en este codelab son los mismos para ambos tipos de dispositivos.

Coprocesador de red (NCP) opcional: El objeto binario ot-ncp-ftd.out implementa la arquitectura de NCP, en la que la pila de OpenThread se ejecuta en el dispositivo y un procesador host la controla a través del protocolo Spinel. El uso de NCP está fuera del alcance de este codelab. Consulta el README de NCP para obtener más detalles.

5. Cómo escribir en la memoria flash del firmware

Usa TI UniFlash para escribir las imágenes ELF en las placas LaunchPad.

Cómo escribir en la memoria flash con UniFlash

  1. Abre UniFlash. Las placas LaunchPad conectadas se muestran en Dispositivos detectados debido a la función de detección automática de dispositivos.Si la placa no se detecta automáticamente, haz clic en Nueva configuración, selecciona el destino LP-EM-CC2745R10-Q1 y elige la sonda de depuración USB XDS110.Dispositivos detectados por UniFlash
  2. Selecciona Board 1 (que se escribirá con ot-rcp.out) y haz clic en Start.
  3. Haz clic en el botón Browse y navega hasta ot-ti/build/bin/ot-rcp.out.Página de Flash de UniFlash
  4. Haz clic en Load Image para escribir el firmware en la memoria flash. El área de registro muestra el progreso y confirma la finalización.
  5. Repite los pasos del 2 al 4 para los tableros 2 y 3, y selecciona ot-ti/build/bin/ot-cli-ftd.out para cada uno.

Alternativa: Realiza el flash con Code Composer Studio (CCS)

Code Composer Studio se puede usar como alternativa a UniFlash y, además, proporciona un entorno de depuración completo:

  1. Descarga e instala Code Composer Studio.
  2. Crea una conexión de destino (CCXML) para el LP-EM-CC2745R10-Q1 con el depurador XDS110. Consulta la Guía del usuario de CCS: Método manual.
  3. Inicia una sesión de depuración sin proyecto, como se describe en CCS User's Guide: Manual Launch.
  4. Conéctate al núcleo Arm Cortex-M33 y haz clic en Load para cargar la imagen ELF.

La configuración predeterminada de CCXML usa cJTAG de 2 cables para que coincida con la configuración predeterminada del puente LP-EM-CC2745R10-Q1. Después de programar a través de JTAG, reinicia la placa para borrar la marca de detención durante el inicio.

6. Programa el HSM

El CC2745R10-Q1 contiene un módulo de seguridad de hardware (HSM) que se debe aprovisionar antes de ejecutar Thread o cualquier otro firmware de aplicación seguro. Si aún no se programó el HSM de la placa LP-EM-CC2745R10-Q1, completa este paso ahora.

Para programar el HSM con UniFlash, haz lo siguiente:

  1. Abre UniFlash y selecciona la placa LP-EM-CC2745R10-Q1 en Detected Devices.
  2. Navega al panel de programación del HSM y carga la imagen de firmware del HSM como se muestra a continuación.

Programación de HSM con UniFlash

  1. Sigue las instrucciones en pantalla para completar el aprovisionamiento del HSM. La operación se registra en la consola de salida de UniFlash.

Consulta la Guía de inicio rápido de CC2745R10-Q1 en TI Resource Explorer para conocer el procedimiento completo de programación del HSM, incluida la ruta de acceso de la imagen de firmware requerida dentro del SDK de SimpleLink Low Power F3.

7. Resumen del firmware

En este punto, las tres placas deberían estar programadas:

  • Placa 1: ot-rcp.out: Desconéctate de la computadora host y conéctate a la Raspberry Pi a través de USB.
  • Tarjeta 2: ot-cli-ftd.out: Mantén la conexión con la computadora host.
  • Tarjeta 3: ot-cli-ftd.out: Mantén la conexión con la computadora host.

La configuración del hardware se verá como el siguiente diagrama. La placa 1 se conecta a la Raspberry Pi como coprocesador de radio para el OTBR, mientras que las placas 2 y 3 permanecen conectadas a la computadora host para acceder a la consola en serie.

Configuración de hardware de CC2745R10 con FTD

8. Configura la consola en serie para dispositivos ot-cli-ftd

El LP-EM-CC2745R10-Q1 expone el UART de la aplicación a través de USB a 921600 baudios.

Abre una terminal serial en el puerto COM de UART de la aplicación (Windows) o en el dispositivo /dev/ttyACM* (Linux/macOS) para cada placa de FTDI con estos parámetros de configuración:

Parámetro

Valor

Velocidad (baudios)

921600

Bits de datos

8

Bits de parada

1

Paridad

None

Control de flujo

None

Sugerencia (Linux/macOS): Para identificar el nodo del dispositivo correcto, ejecuta ls /dev/ttyACM* antes y después de conectar una placa, y observa qué entrada aparece. Cada LP-EM-CC2745R10-Q1 crea dos entradas: el puerto con el número más bajo es el UART de depuración XDS110 y el puerto con el número más alto es el UART de la aplicación. Por ejemplo, si la placa crea /dev/ttyACM0 y /dev/ttyACM1, usa /dev/ttyACM1.

Nota (Windows): Abre el Administrador de dispositivos y busca dos puertos COM nuevos en Puertos (COM y LPT) cuando se conecte una placa. Por lo general, el puerto de datos de depuración XDS110 aparece primero. Usa el segundo puerto COM (con un número más alto) para la consola de la aplicación.

Presiona Intro en la terminal para obtener un mensaje de la CLI de OpenThread (>). Para ver una lista completa de los comandos disponibles, consulta la Referencia de la CLI de OpenThread. Verifica que el FTD esté en funcionamiento:

> state
disabled
Done

FTD de terminal en serie

Aún no configurarás una consola en serie para la placa RCP. El OTBR de la Raspberry Pi se comunica directamente con el RCP. En el siguiente paso, configurarás la Raspberry Pi como el Border Router de OpenThread.

9. Configura la Raspberry Pi como un router de borde

El OTBR se compila a partir de ot-br-posix, el proyecto de código abierto OpenThread Border Router. El Border Router se ejecuta en la Raspberry Pi y usa la placa 1 (RCP) como radio 802.15.4 a través de USB.

Configuración de Raspberry Pi

  1. Graba Raspberry Pi OS (Lite o Desktop de 64 bits) en tu tarjeta SD con Raspberry Pi Imager.
  2. Inicia el Raspberry Pi y abre una terminal (a través de SSH o directamente).
  3. Actualiza el administrador de paquetes y actualiza los paquetes instalados:
    $ sudo apt-get update
    $ sudo apt-get upgrade -y
    

Reinicia la Raspberry Pi después de las actualizaciones antes de continuar: sudo reboot

Conecta la placa 1 (RCP) a la Raspberry Pi

Conecta la placa 1 (con la imagen de ot-rcp grabada) a la Raspberry Pi a través de un cable micro-USB. Después de la conexión, verifica que aparezca el nodo del dispositivo:

$ ls /dev/ttyACM*
/dev/ttyACM0
/dev/ttyACM1

Por lo general, el UART de la aplicación de la placa RCP es /dev/ttyACM1 (el UART de depuración XDS110 es /dev/ttyACM0). Verifica qué puerto es el UART de la aplicación. Para ello, comprueba que responda cuando se inicie el agente de OTBR en un paso posterior. Si hay otros dispositivos seriales USB conectados, es posible que el número de nodo del dispositivo sea diferente. Ajusta la ruta en la configuración de OTBR según corresponda.

Compila e instala ot-br-posix

En la Raspberry Pi, clona y compila ot-br-posix:

$ git clone https://github.com/openthread/ot-br-posix.git
$ cd ot-br-posix
$ ./script/bootstrap

Ejecuta la secuencia de comandos de configuración y especifica tu interfaz Ethernet como la interfaz de backbone (infraestructura):

$ INFRA_IF_NAME=eth0 ./script/setup

eth0 es el nombre típico de la interfaz Ethernet con cable. Si conectas la Raspberry Pi a través de Wi-Fi en lugar de Ethernet, reemplaza eth0 por wlan0 (y asegúrate de que la Pi ya esté conectada a tu red Wi-Fi). Verifica el nombre de la interfaz activa con ip link show.

La secuencia de comandos de configuración compila ot-br-posix desde la fuente, instala los servicios del sistema otbr-agent y otbr-web, y configura la pila de redes. Por lo general, este proceso tarda entre 10 y 20 minutos en una Raspberry Pi 4B.

Configura el agente de OTBR

Edita el archivo de configuración del agente de OTBR para especificar la ruta de acceso del dispositivo RCP y la velocidad de transmisión:

$ sudo nano /etc/default/otbr-agent

Busca la línea OTBR_AGENT_OPTS y actualízala para que haga referencia al UART de la aplicación del RCP:

OTBR_AGENT_OPTS="-I wpan0 -B eth0 spinel+hdlc+uart:///dev/ttyACM1?uart-baudrate=921600"

Reemplaza eth0 por wlan0 si tu Raspberry Pi está conectada a través de Wi-Fi.

OTBR_AGENT_OPTS="-I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM1?uart-baudrate=921600"

El UART de la aplicación RCP LP-EM-CC2745R10-Q1 funciona a 921,600 baudios. Verifica que la ruta del dispositivo (/dev/ttyACM1 en este ejemplo) coincida con el UART de la aplicación de la placa RCP.

Reinicia el agente de OTBR para aplicar la configuración:

$ sudo systemctl restart otbr-agent
$ sudo systemctl enable otbr-agent

Verifica que el agente esté en ejecución:

$ sudo systemctl status otbr-agent

Interactúa con el nodo de RCP

Comunícate con el nodo de RCP usando la herramienta ot-ctl:

$ sudo ot-ctl state
disabled
Done

Puedes supervisar el registro del agente de OTBR para ver los mensajes de conexión y estado:

$ sudo journalctl -u otbr-agent -f

De manera opcional, la interfaz web del OTBR está disponible en http://:80 y proporciona una vista gráfica de la red de Thread.

Para detener o reiniciar el agente de OTBR, haz lo siguiente:

$ sudo systemctl stop otbr-agent
$ sudo systemctl start otbr-agent

En este punto, deberías tener tres consolas activas:

  1. Terminal serial para Board 2 (ot-cli-ftd 1) en la computadora host.
  2. Terminal serial para la placa 3 (ot-cli-ftd 2) en la computadora host.
  3. Sesión de SSH o de terminal en la Raspberry Pi para ot-ctl (OTBR/RCP).

Ya puedes formar una red de Thread.

10. Cómo crear una red de Thread

Cómo configurar el RCP (OTBR)

Crea una nueva red de Thread desde el shell ot-ctl en la Raspberry Pi. Ingresa los siguientes comandos en orden:

Índice

Comando

Descripción

Respuesta esperada

1

dataset init new

Crea una configuración de red nueva.

Listo

2

dataset commit active

Confirma el nuevo conjunto de datos en el conjunto de datos operacionales activo.

Listo

3

ifconfig up

Habilita la interfaz de Thread.

Listo

4

thread start

Habilita y adjunta la operación del protocolo Thread.

Listo

Espera 10 segundos para que aparezca la interfaz de Thread.

5

state

Verifica el estado del dispositivo. Debe ser leader. Otros estados posibles: sin conexión, inhabilitado, desconectado, secundario, router o líder.

líder
Listo

6

dataset

Visualiza la configuración de red. Tus valores serán diferentes. Ten en cuenta el canal, la clave de red, el nombre de la red y el ID de PAN, ya que son necesarios para unir los FTD a la red.

Marca de tiempo activa: 1
Canal: 20
Máscara de canal: 0x07fff800
PAN ID extendido: 39ba71f7fc367160
Prefijo local de malla: fd5c:c6b:3a17:40b9::/64
Clave de red: 81ae2c2c17368d585dee71eaa8cf1e90
Nombre de red: OpenThread-008c
PAN ID: 0x008c
PSKc: c98f0193d4236025d22dd0ee614e641f
Política de seguridad: 0, onrcb
Listo

Cómo agregar FTD a la red de Thread (método fuera de banda)

Con el método de puesta en servicio fuera de banda, proporcionas las credenciales de la red directamente. En la terminal serial de cada placa FTD, ingresa los siguientes comandos con la clave de canal y de red de la salida del conjunto de datos del OTBR que se mostró anteriormente:

Índice

Comando

Descripción

Respuesta esperada

1

dataset channel 20

Establece el canal para que coincida con el OTBR. Reemplaza 20 por el valor del canal de tu OTBR.

Listo

2

dataset networkkey 81ae2c2c17368d585dee71eaa8cf1e90

Establece la clave de red. Reemplaza este valor por la clave de red de tu OTBR. Solo se requiere esta llave para colocar el candado.

Listo

3

dataset commit active

Confirma el nuevo conjunto de datos en el conjunto de datos operacionales activo.

Listo

4

ifconfig up

Habilita la interfaz de Thread.

Listo

5

thread start

Habilita y adjunta la operación del protocolo Thread.

Listo

Espera 20 segundos mientras el dispositivo se une y se configura.

6

state

Verifica el estado del dispositivo.

hijo o hija
Listo

Debido a la naturaleza de autoconfiguración de las redes de Thread y a que estos son dispositivos Full Thread, es posible que uno o ambos FTD se conviertan en routers. Puedes verificar el rol actual en cualquier momento con el comando state.

Comunicación entre dispositivos Thread

Usa el comando ping para verificar que los dispositivos puedan comunicarse. Obtén las direcciones IPv6 de cada dispositivo con ipaddr:

> ipaddr
fd5c:c6b:3a17:40b9:0:ff:fe00:fc00		# Leader Anycast Locator (ALOC)
fd5c:c6b:3a17:40b9:0:ff:fe00:1800		# Routing Locator (RLOC)
fd5c:c6b:3a17:40b9:84e2:bae8:bd5b:fa03		# Mesh-Local EID (ML-EID)
fe80:0:0:0:c449:ca4a:101f:5d16			# Link-Local Address (LLA)
Done

Desde ambos FTD, haz ping al OTBR con su dirección RLOC:

> ping fd5c:c6b:3a17:40b9:0:ff:fe00:1800
Done
>
> 16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=30ms
16 bytes from fd5c:c6b:3a17:40b9:0:ff:fe00:1800: icmp_seq=3 hlim=64 time=52ms

Una respuesta correcta confirma que la red de Thread está en funcionamiento y que los dispositivos pueden comunicarse. Repite el proceso para hacer ping a cada FTD desde el OTBR (sudo ot-ctl ping ).

11. Felicitaciones

Creaste una red de Thread con placas TI CC2745R10-Q1.

Ahora ya sabes lo siguiente:

  • Cómo configurar el entorno de compilación de ot-ti de Texas Instruments
  • Cómo compilar y grabar los archivos binarios de la CLI de OpenThread en la placa de desarrollo LP-EM-CC2745R10-Q1 LaunchPad
  • Cómo configurar una Raspberry Pi como un router de borde de OpenThread (OTBR) con ot-br-posix
  • Cómo crear una red de Thread en el OTBR
  • Puesta en servicio fuera de banda de dispositivos en una red Thread
  • Cómo verificar la comunicación de Thread entre nodos con el comando ping

Lecturas adicionales

Consulta openthread.io y GitHub para obtener una variedad de recursos de OpenThread, incluidos los siguientes: