venerdì , 19 Luglio 2019
iten
Home » Elettronica » BlueNRG shield per STM32 Nucleo

BlueNRG shield per STM32 Nucleo

Ho ricevuto un campione gratuito della shield X-NUCLEO-IDB04A1 durante una recente giornata di training tecnico presso l'ST. Si tratta di una shield compatibile con Arduino basata sul processore di rete BlueNRG di ST Microelectronics, che permette di creare applicazioni Bluetooth Low Energy (BLE) 4.0. Ovviamente, ST distribuisce il software per questa shield per essere prevalentemente compatibile con le sue schede di sviluppo della famiglia Nucleo. Infatti, tutte le librerie e gli esempi forniti sono progettati per essere eseguiti o su una Nucleo-L0 o Nucleo-F4. Tuttavia, ST non fornisce supporto ufficiale per le toolchain Open Source basate su GCC/Eclipse (e secondo me questo è un peccato...), e non è proprio immediato compilare sia i progetti demo allegati sia le librerie di astrazione del chip BlueNRG senza l'uso di un IDE commerciale ufficialmente supportato (IAR, TrueSTUDIO, ecc). Possedendo una Nucleo-F4, non potevo esimermi dal provarci 🙂

In questo post vi mostrerò tutti i passi necessari alla corretta compilazione delle librerie e di un progetto demo basato sul chip BlueNRG. ST, inoltre, fornisce anche un App per Android e per iOS progettata per interagire con la demo che testeremo. Alla fine di quest'articolo saremo perfettamente in grado di interagire con la nostra Nucleo tramite la shield X-NUCLEO-IDB04A1. Comunque, occorre precisare che è fuori dagli scopi di quest'articolo spiegare nel dettaglio come il codice di esempio funziona. Mi prometto di occuparmene in futuro (anche perché reputo questo chip molto interessante). In questo post mi limiterò a mostrare gli step necessari ad importare le librerie BlueNRG in Eclipse CDT e compilarle correttamente. Cosa che, credetemi, non è proprio immediata soprattutto se siete alle prime armi con la piattaforma STM32 e la toolchain Eclipse/GCC.

Due parole su chip BlueNRG

Prima di cominciare a divertirci con questa shield, lasciatemi dire giusto un paio di cose su questo chip di ST. BlueNRG è un processore di rete monolitico composto da un core Cortex-M0 più un transceiver radio in grado di operare nella banda di frequenze 2.4GHZ. Sono richiesti solo pochi altri componenti esterni (un paio di oscillatori, e qualche passivo) per far funzionare il chip e accordare l'antenna esterna. Questo chip viene fornito pre-programmato da ST con uno stack di rete compatibile Bluetooth 4.0 Low Energy (BLE). Inoltre, il chip fornisce la possibilità di aggiornarsi OTA (Over The Air), nel caso in cui ST rilasci nuove versioni del firmware interno. Il fatto che tutta la parte dello stack di rete sia già implementata all'interno del chip BlueNRG implica che non dobbiamo minimamente preoccuparci di tutti i dettagli implementativi del protocollo Bluetooth. E questo, credetemi, non è una cosa da poco.
L'applicazione utente deve, quindi, essere implementata in un microcontrollore esterno. Tuttavia, dato che la parte più "pesante", ossia lo stack di rete, è implementata in un chip esterno, non è necessario adoperare chissà quale µC: un chip della linea "value line" STM32-F0, o meglio un STM32-L0 per applicazioni low power, sarà più che sufficiente. È in quella linea ST commercializza chip con un costo anche inferiore ai 50 centesimi. Ho stimato che con un costo complessivo di €3/1000pcs ci state dentro per realizzare tutta la parte di controllo e gestione del Bluetooth, antenna compresa. Un target price molto, ma molto interessante.

st ble stackIl processore BlueNRG interagisce con l'applicazione utente residente nel µC esterno tramite l'interfaccia SPI. ST ha sviluppato un Application Controller Interface (ACI) - una sorta di API costruita sull'SPI - che consente agli sviluppatori di interagire con il chip senza conoscere i dettagli implementativi dello stack BLE. Per semplificare il processo di sviluppo, ST fornisce un set completo di librerie, che a loro volta sono basate sul framework STM32Cube-Fx (sono concepite come un plug-in del framework). Questo set di librerie è chiamato X-CUBE-BLE1.

bluenrg stack api X-CUBE-BLE1  contiene questi componenti principali:

  • l'HAL completa BlueNRG, che astrae dai dettagli implementativi dell'interfaccia ACI;
  • una libreria Low Power Manager (LPM), progettata per gestire correttamente le funzionalità low power del chip BlueNRG;
  • due Board Support Package (BSP), un insieme di configurazioni hardware specifiche per le schede Nucleo-L0 e Nucleo-F4;
  • i driver per la shield X-NUCLEO-IDB04A1;
  • 4 differenti progetti demo per testare le funzionalità del chip BlueNRG; le demo sono progettare per essere eseguite su una board STM32 Nucleo e la shield X-NUCLEO-IDB04A1.

Requisiti hardware e software

Le istruzioni di quest'articolo si basano sui seguenti requisiti hardware/software:

  • Una toolchain GCC/Eclipse completa per STM32 , basata sul plug-in GNU ARM Eclipse, come descritto in questa serie.
  • Una scheda di sviluppo STM32-Nucleo-F401RE (non dovrebbe essere molto complicato modificare i sorgenti per adattarli ad un'altra Nucleo).
  • Una shield A X-NUCLEO-IDB04A1 compatibile Arduino.

Come compilare un progetto demo per BlueNRG

Il primo passo consiste nel creare un progetto di test usando il plugin GCC ARM per Eclipse. Potete scegliere il nome che volete per il progetto, ma prestate attenzione ai parametri di configurazione durante il wizard di generazione del progetto.

Schermata 2015-03-05 alle 07.32.20Non dimenticate, infatti, di abilitare il semihosting ARM,  dato che l'applicazione di esempio fornita da ST fa uso estensivo di tale funzionalità per stampare messaggi di debug sulla console. Vi mostrerò poi, alla fine del tutorial, come disattivare il semihosting, per poter usare la demo anche senza una sessione di debug (quando è attivo il semihosting, la chiamata alla funzione print() genera un blocco se non è attiva una connessione valida ad OpenOCD per stampare i messaggi - questo è un errore tipico di quando si comincia a sviluppare con STM32).
Ok. Lasciamo quindi generare ad Eclipse lo scheletro del nostro progetto di test. Nel frattempo scarichiamo il package X-CUBE-BLE1 da questa pagina (il link per il download si tra in fondo alla pagina). Assumerò che il software viene estratto nella directory C:\STM32Toolchain, ma siete liberi di cambiare path a piacimento. Ovviamente, dovrete riadattare le mie istruzioni. A questo punto non ci resta che importare nel progetto Eclipse tutti i file necessari alla corretta compilazione della demo.
Come primo step, create una nuova cartella nel progetto Eclipse, e nominatela bluenrg-stack.

Schermata 2015-03-05 alle 07.37.10Poi, create una sottocartella di questa e chiamatela BSP. Adesso, andate nella directory del filesystem C:\STM32Toolchain\X-CUBE-BLE1\Drivers\BSP e trascinate le cartelle STM32F4xx-Nucleo e X-NUCLEO-IDB04A1 all'interno della cartella Eclipse BSP che abbiamo creato (alla fine di questo post, troverete un video che vi mostra in maniera chiara tutto il processo). Eclipse mostrerà una finestra di dialogo che vi chiede in che modo importare i file nel progetto: scegliete "Copy files and folder". Schermata 2015-03-08 alle 10.29.01

Su questo punto è necessaria una precisazione. Sarebbe molto più opportuno scegliere l'opzione "Link to files and folders", perché quando ST rilascerà un aggiornamento del pacchetto software vi occorrerà banalmente sostituire i file all'interno della directory C:\STM32Toolchain\X-CUBE-BLE1, e ricompilare il progetto. Tuttavia, questa scelta complicherebbe un poco il tutorial, ed ho preferito evitarla. Vi suggerisco, quando avrete compilato con successo tutto il progetto di test, di rigenerarlo cambiando questa opzione. Non dovrebbe essere molto difficile. Vi annuncio già che si tratta di giocare un poco con i path, ma niente di trascendentale. 
Adesso, bisogna analogamente trascinare tutta la cartella C:\STM32Toolchain\X-CUBE-BLE1\Middlewares all'interno della cartella Eclipse bluenrg-stack. Scegliete sempre "Copy files and folder" quando chiestovi. Ora, dobbiamo cancellare il file main.c generato dal plugin GCC ARM, in quanto useremo il main fornito dal progetto di test. Quindi, andate nella cartella Eclipse src e cancellate il file main.c, e trascinate nella stella cartella SOLO questi file contenuti nella cartella C:\STM32Toolchain\X-CUBE-BLE1\Projects\Multi\Applications\SensorDemo\Src:

  • bluenrg_interface.c
  • clock.c
  • cube_hal_f4.c
  • main.c
  • sensor_service.c
  • stm32xx_it.c

Allo stesso modo, trascinate nella cartella Eclipse include questi file dalla cartella C:\STM32Toolchain\X-CUBE-BLE1\Projects\Multi\Applications\SensorDemo\Inc:

  • bluenrg_interface.h
  • connection_config.h
  • cube_hal.h
  • sensor_service.h
  • stm32xx_it.h

Ok. Adesso dobbiamo dire ad Eclipse di compilare i file importati, dato che per default Eclipse non lo fa. Per abilitare la compilazione, cliccate con il tasto destro del mouse sulla cartella Eclipse bluenrg-stack nel pannello Project Explorer, e scegliete Properties. Schermata 2015-03-08 alle 10.54.51Andiamo in C/C++ Build->Settings e TOGLIAMO la spunta alla voce "Exclude resource from build", come mostrato sotto. Schermata 2015-03-08 alle 10.58.01In maniera analoga, dobbiamo abilitare la compilazione del file stm32f4xx_hal_spi.c  (per default, il plug-in GCC ARM disabilita la compilazione dei file non usati per ridurre il processo di compilazione del progetto). Andate in nella cartella Eclipse system/src/stm32f4-hal; cliccate sul file stm32f4xx_hal_spi.c; scegliete Properties e in C/C++ Build->Settings TOGLIETE la spunta a "Exclude resource from build".

Ok. Il grosso del lavoro è fatto. Dobbiamo solamente aggiungere un paio di definizioni di macro e i path alle direttive di include. Le due macro da aggiungere sono:  USE_STM32F4XX_NUCLEO e BLUENRG_CONFIG=BLUENRG_32_MHZ. Queste macro dicono rispettivamente di compilare il progetto per una board Nucleo-F4  e di configurare il chip BlueNRG per lavorare con un clock di 32Mhz (fate riferimento alla documentazione del chip su questo punto). Le macro si aggiungo nel modo seguente. Andate nelle proprietà del progetto (cliccate con il tasto destro del mouse sulla cartella principale del progetto e scegliete Properties), poi in C/C++ Build->Settings. Nel tab Tool Settings scegliete la voce "Cross ARM C Compiler->Preprocessor" e cliccate sull'icona "Add...". Aggiungete le macro come mostrato sotto:

Schermata 2015-03-08 alle 11.00.55Allo stesso identico modo, aggiungiamo i path alle directory contenente gli header file necessari alla compilazione delle librerie. Nella stessa finestra, scegliete la voce "Cross ARM C Compiler->Includes" e aggiungete i seguenti path:

  • ../bluenrg-stack/Middlewares/ST/LowPowerManager/Inc
  • ../bluenrg-stack/Middlewares/ST/STM32_BlueNRG/SimpleBlueNRG_HCI/includes
  • ../bluenrg-stack/BSP/STM32F4xx-Nucleo
  • ../bluenrg-stack/BSP/X-NUCLEO-IDB04A1
Schermata 2015-03-08 alle 11.08.44

Finito 🙂 Potete compilare il progetto di test e caricarlo sulla vostra Nucleo con OpenOCD (non dimenticate di creare una configurazione di debug come mostrato nella mia serie sulla toolchain GCC/Eclipse per STM32). Per testare l'applicazione demo, dovete scaricare l'App fornita da ST sia per Android sia per iOS. Il nome dell'App è "BlueNRG" e la potete trovare sull'Apple App Store e sul Google Play Store. Tenete a mente che la demo non è niente altro che una simulazione di un sensore giroscopico, di temperatura e di umidità. I dati quindi non sono reali.

Screenshot_2015-03-08-11-13-15 Screenshot_2015-03-08-11-13-20 (1)

Alcuni chiarimenti

Come detto prima, questa demo usa il semihosting ARM per stampare messaggi di debug sulla console di OpenOCD.Schermata 2015-03-08 alle 11.40.10Tuttavia, questo impedisce di poter usare la nostra demo senza una connessione di debug. Si può disabilitare il semihosting "corrompendo" le corrispondenti macro (ho aggiunto una "x"), come mostrato sotto: Schermata 2015-03-08 alle 11.38.31Un altro aspetto importante da chiarire è che a differenza di altri tutorial fatti in passato, questa volta non abbiamo dovuto modificare il codice di configurazione del clock della nostra Nucleo nel file __initialize_hardware.c, perché la demo di esempio già fornisce il corretto codice di compilazione per una Nucleo-F401RE nel file cube_hal_f4.c. Questo implica che sarà necessario modificare il contenuto della funzione SystemClock_Config(void) in quel file se avete una Nucleo differente (magari usando il tool STCubeMX). Infine, durante la compilazione vi appariranno un sacco di messaggi di warning. Questo accade perché alcune macro definite nelle librerie di astrazione al BlueNRG vengono già definite dal plug-in GNU ARM per Eclipse. Potete ignorare questi messaggi tranquillamente.

Come sempre, potete scaricare tutto il progetto di test dal mio repository Github. Ho anche realizzato un video in cui mostro tutto il processo di import e configurazione, così da rendere tutto più chiaro.

In un prossimo articolo entreremo più nel dettaglio del codice di esempio. A presto 😉


Check Also

Recensione #4: Stazione saldante JBC CD-2B

Internet è piena di stazioni saldanti a meno di €100. Si tratta di prodotti cinesi, …

11 comments

  1. Ciao Carmine, ho una nucleo f411re simile a quella che usi tu, seguendo i tuoi consigli sono riuscito a realizzare la toolchain con eclipse e sbizzarrirmi con qualche piccolo progettino adattando il codice alla mia nucleo. Insieme alla piccola ho anche lo shield bluenrg, sarà la mia poca esperienza con il C ma non riesco a capire come funzionano i progetti di esempio. Hai in programma di realizzare qualche guida introduttiva a riguardo?

    Grazie in anticipo,
    Gabriele.

    • Ciao Gabriele,
      mi ero ripromesso di tornare sull'argomento ma poi sto dedicando il mio tempo "hobbystico" a scrivere qualcosa di più articolato sull'argomento STM32. Ricordo che la libreria di BlueNRG non era proprio easy to use. Spero di ritornarci presto sull'argomento.

      • This sounds really strange. Are you sure that your Nucleo works properly? I've tested the binary file also on another Nucleo, and it works perfectly. Without a debug session is impossible to say what's going wrong.

  2. Benedetta Demicheli

    Ciao carmine
    è possibile creare una connessione seriale tra pc e nucleo 401 (con questo shield bluetooth) in modo da stampare su una console come TeraTerm o Putty i dati raccolti da uno shield di sensori (la MEMS inertial and Environmental)? Perché in esempi trovati sul web o su mbed la connessione è sempre fatta con uno smartphone attraverso le app BLENRG o AlpWise. A me invece interesserebbe creare la connessione bluetooth e pc con sistema operativo Windows 10, in modo da stampare i dati raccolti dallo shield su una console

    • Carmine Noviello

      Ciao Benedetta,
      ma non ti converrebbe collegare direttamente la Nucleo+Shield X-NUCLEO-IKS01A1 direttamente al PC via interfaccia ST-LINK? Non mi è chiaro perché vuoi passare tramite Bluetooth se poi dici che non ti serve.

      • Benedetta Demicheli

        Io devo mandare i dati raccolti dalla scheda MEMS via bluetooth al pc, senza usare il cavo usb ovviamente. Quindi mi serve sapere come fare a mandare i dati direttamente da nucleo a pc via bluetooth, oppure come mandare i dati da nucleo ad una seconda nucleo sempre tramite BLE

  3. Ciao Carmine,
    potresti fornire una guida anche su come far funzionare BlueNRG su una scheda non nucleo? in particolare io sarei interessato ad utilizzare SFBTLE-RF su una scheda PyBoard 1.x (Micropython) e ci sono parecchi utenti sul forum interessati ad un modulo BLE.

    Saluti,
    Francesco

    • Carmine Noviello

      Ciao Francesci,
      quello che chiedi non è una cosa "banale" 🙂 Si tratterebbe di portare le libre BLE di ST (che per inciso non sono tutta sta grande cosa) sotto "micropython". E richiederebbe un lavoro non banale. Purtroppo il al momento dedico il 100% del mio tempo non lavorativo libero al libro che sto scrivendo su STM32, e devo finire questo lavoro prima di fare altri 😉

  4. Ciao Carmine,
    la scheda d'espansione è utilizzabile su schede board nucleo-144 F2?

    Grazie!

    • Carmine Noviello

      Credo di si, il pinout Arduino alla fine è quello. Prova a controllare esattamente il pinout, ma credo che non ci sono problemi.

Rispondi a Carmine Noviello Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.