banner
Hogar / Blog / Uso de Raspberry Pi Pico W para Bluetooth bajo
Blog

Uso de Raspberry Pi Pico W para Bluetooth bajo

Jun 16, 2023Jun 16, 2023

Fred Eady | 31 de agosto de 2023

Con la llegada de la versión 1.5.1, el SDK de Raspberry Pi Pico ahora admite Bluetooth Classic y Bluetooth Low Energy (BLE) en la plataforma de desarrollo Raspberry Pi Pico W. Como era de esperar, tras el anuncio de la compatibilidad con Bluetooth, estuvieron disponibles varios ejemplos de Pico Bluetooth basados ​​en un puerto de BTstack de BlueKitchen. El código de ejemplo portado del SDK de Raspberry Pi Pico conserva el formato de lenguaje BTstack C original. Sin embargo, la mayoría de los ejemplos de Pico Bluetooth basados ​​en BTstack que se pueden encontrar en el dominio público se han realizado en MicroPython o Arduino. Con eso, el objeto de esta discusión será producir un ejemplo funcional de Pico Bluetooth de baja energía en lenguaje C desarrollado bajo Ubuntu 22.04 LTS usando Visual Studio Code y la última cadena de herramientas Raspberry Pi Pico SDK. Puede obtener el código fuente del proyecto de ejemplo en el sitio de descargas de EDTP Electronics.

Para aquellos de ustedes que no estén familiarizados con Raspberry Pi Pico W, PicoW es una implementación de hardware BLE básica que consiste en un microcontrolador que supervisa la transmisión y recepción del tráfico de radio Bluetooth a través de un módulo de radio Bluetooth. El microcontrolador está gobernado por una pila Bluetooth; La inclusión de una pila Bluetooth permite que el hardware PicoW asuma el papel de cliente o servidor en una aplicación Bluetooth. Por lo tanto, el PicoW se puede programar para actuar como un dispositivo de recopilación de datos remoto que da servicio a sensores o un dispositivo de almacenamiento y envío de datos que recopila datos de sensores de dispositivos remotos y transfiere los datos recopilados a una ubicación de procesamiento central. El hardware PicoW también es capaz de funcionar en modo independiente procesando información Bluetooth entrante y actuando en consecuencia a través de su banco de pines GPIO y periféricos en el chip.

Comenzamos el proceso de desarrollo del firmware instalando la versión 1.5.1 del SDK de Raspberry Pi Pico. Las instrucciones de instalación de Raspberry Pi Pico SDK y la cadena de herramientas GNU para Linux se pueden encontrar en el sitio web de Raspberry Pi. El siguiente paso implica la instalación de Visual Studio Code. Para Ubuntu 22.04 LTS, queremos descargar e instalar la versión Debian de Visual Studio Code. La instalación de Visual Studio Code se puede realizar utilizando el instalador de aplicaciones Debian integrado en Ubuntu 22.04 LTS.

Después de la instalación, Visual Studio Code requiere cierta personalización. Para admitir el proceso de compilación, debemos instalar las extensiones de Visual Studio Code CMake Tools, que también instala la extensión CMake y Serial Monitor. Para una compilación exitosa, CMake debe saber dónde está instalado el SDK de Raspberry Pi Pico. La ubicación absoluta del SDK de Raspberry Pi Pico se identifica mediante la configuración de Cmake:Environment PICO_SDK_PATH, que ingresamos manualmente en la configuración de la extensión CMake Tools. Estamos ejecutando el SDK de Raspberry Pi Pico y la cadena de herramientas asociada en Linux. Entonces, también debemos ingresar Unix Makefiles en el campo CMake Tools Cmake:Generator settings. Eso es todo. Visual Studio Code está listo para usar.

El SDK de Raspberry Pi Pico utiliza Python y PyCryptodomex para crear una imagen de base de datos binaria de los servicios y características de Bluetooth que deben incluirse en el código fuente de nuestra aplicación Bluetooth. Python se instala con el paquete Ubuntu 22.04 LTS. Debemos instalar PyCryptodomex manualmente. La instalación de PyCryptodomex se realiza mediante el proceso de instalación estándar sudo apt de Ubuntu. Las instrucciones detalladas de instalación de PyCryptodomex se pueden encontrar en la página web de documentación de PyCryptodomex. Con la incorporación de PyCryptodomex a nuestra cadena de herramientas Raspberry Pi Pico SDK, ahora estamos listos para comenzar a codificar nuestra aplicación Raspberry Pi Pico W BLE.

Nuestra aplicación BLE se basará en el ejemplo nordic_spp_le_counter del SDK de Raspberry Pi Pico. El ejemplo nordic_spp_le_counter es una versión similar del Nordic NUS (Servicio Nórdico UART). El Nordic NUS permite que los dispositivos BLE se comuniquen mediante Bluetooth como si hubiera un UART presente en ambos lados del enlace de comunicaciones. El ejemplo de Raspberry Pi Pico SDK nordic_spp_le_counter es en realidad una copia del ejemplo de BTstack del mismo nombre. No encontrará el bloque completo del código fuente de ejemplo nordic_spp_le_counter en el árbol de directorios del SDK de Raspberry Pi Pico. Entonces, usaremos el código fuente de ejemplo de BTstack nordic_spp_le_counter como plantilla para nuestra compilación de firmware.

nordic_spp_le_counter obtiene su apariencia NUS al emplear copias idénticas del servicio NUS original de 128 bits y los UUID característicos y llamadas API contenidos en el archivo BTstack nordic_spp_service_server.c. Crearemos manualmente un archivo llamado picow_nus.gatt en el que colocaremos los UUID NUS de 128 bti. Los UUID de NUS serán utilizados por un script de Python (compile_gatt.py) en el proceso de compilación para generar una base de datos de atributos (ATT), que terminará como una matriz llamada perfil_data que reside dentro de un archivo generado por compile_gatt.py llamado picow_nus. h. Si observa el contenido del archivo picow_nus.h, también encontrará definiciones de identificadores de atributos para el servicio NUS y los UUID característicos. En este caso, un identificador de atributo no es más que un número de 16 bits que identifica el valor particular del Servicio o Característica. Los valores del identificador de atributos se utilizan en la llamada API nordic_spp_service_server_init. La generación de la base de datos de atributos NUS y el archivo picow_nus.h se rige por el contenido del archivo CMakeLists.txt.

Nuestro ejemplo nordic_spp_le_counter se ejecuta como un servidor BLE. El cliente BLE tiene la forma de una aplicación llamada LightBlue, que se ejecuta en un teléfono Android. La aplicación del servidor BLE se compone de un componente publicitario, un módulo de temporizador de latidos y un par de controladores de paquetes. El UART0 de Raspberry Pi Pico W estará habilitado para controlar la extensión Visual Studio Code Serial Monitor.

El flujo de la aplicación del servidor BLE comienza con la inicialización del controlador de radio BLE CYW43 de Raspberry Pi Pico W. Si el controlador CYW43 activa con éxito la radio BLE, se inicializan las capas de pila BLE L2CAP (Protocolo de adaptación y control de enlace lógico) y SM (Protocolo de administrador de seguridad). El siguiente paso configura y registra el controlador de paquetes (stack_event_packet_handler) que monitorea los eventos devueltos por la pila de Bluetooth. El stack_event_packet_handler se activa cuando la pila Bluetooth se conecta y cuando el cliente BLE se desconecta del servidor BLE. Con la excepción del byte de control de encendido/apagado del LED de estado de conexión dentro de stack_event_packet_handler, las funciones proporcionadas por stack_event_packet_handler son puramente informativas. Después del registro de stack_event_packet_handler, el servidor ATT se inicializa utilizando la información de la base de datos ATT contenida en la matriz perfil_data, y cualquier evento relacionado con el servidor ATT se dirige a stack_event_packet_handler. Antes de dar el comando para activar Bluetooth, nordic_spp_packet_handler debe estar registrado para monitorear eventos y datos pasados ​​hacia y desde la API nordic_spp_service_server. En este punto, estamos listos para activar el temporizador de latidos de 1000 mS, encender Bluetooth y comenzar a anunciar. Si todo va según lo previsto, el LED de estado de conexión empezará a parpadear en intervalos de 1000 mS.

El PicoW está programado para actuar como un dispositivo periférico BLE. Antes de establecer una conexión, un dispositivo periférico BLE transmite información que se describe a sí mismo mediante un método llamado publicidad. La aplicación LightBlue asume el papel central de BLE. Un dispositivo central BLE busca anuncios de periféricos BLE y utiliza los datos publicitarios para decidir si se conecta a un periférico BLE publicitario o no. Los datos del anuncio incluyen el nombre local PicoW, que aparecerá en la lista de escaneo de la aplicación LightBlue. En este caso, la decisión de conectarse queda en manos del operador humano. Forzaremos que el dispositivo central BLE a través de la aplicación LightBlue se conecte al dispositivo periférico PicoW BLE. Después de conectarse a PicoW, toque la función Notificar. Aparecerá una nueva pantalla que le permitirá seleccionar el formato de datos y suscribirse a los datos de recuento que transmite el servidor BLE (PicoW). Elija Cadena UTF-8 como formato de datos y toque Suscribirse. El LED de estado de conexión dejará de parpadear y se encenderá de forma fija. Verá “Contador BTstack xxx” en el área LEER/VALOR INDICADO de la pantalla, siendo xxx un valor de recuento numérico. Conecte los pines UART del Pico W a su computadora personal usando un cable USB a serie FTDI y ejecute Serial Monitor desde Visual Studio Code. Elija Puerto /dev/ttyUSB0-FTDI y establezca la velocidad en baudios en 115200. Debería ver "ENVIAR: BTstack counter xxx" desplazándose en la ventana Serial Monitor. También puede enviar datos al servidor BLE eligiendo la característica Escribible e ingresando sus datos para ser transmitidos en el área VALORES ESCRITOS. Si elige enviar en formato hexadecimal, verá que los datos que envió al servidor BLE se muestran como “RECV: xx xx” en la ventana Serial Monitor, donde “xx xx” son los datos hexadecimales que ingresó para ser transmitidos.

El ejemplo nordic_spp_le_counter se puede adaptar para usarlo con control remoto, registro de datos y monitoreo remoto. También puede reemplazar el cliente BLE LightBlue con su propia aplicación cliente BLE de Android.

Más información sobre formatos de texto