Alla scoperta delle schede di sviluppo STM32 Nucleo
Nei giorni precedenti alla Maker Faire di Roma svoltasi dal 3 al 5 Ottobre 2014, era possibile registrarsi alla pagina facebook STM32 e quindi scaricare un coupon che dava il diritto a ritirare, gratuitamente, presso lo stand ST una scheda di sviluppo STM32 Nucleo Board. Come me molti altri hanno approfittato di questa ghiotta opportunità e ora si ritrovano con una (o più) board sul banco. E’ giunta quindi l’ora di dare una spolverata alla board e farci qualcosa!
In questo tutorial descriverò brevemente la serie Nucleo Board, per passare al dettaglio della sola scheda STM32L053R8 che è la scheda in omaggio fornita alla Maker Faire (ma qualcuno è riuscito ad averne di più performanti, vero Giovanni e Marcello?). Passerò poi alla descrizione della preparazione del PC che servirà a programmare la scheda, e infine alla descrizione generale degli IDE utilizzabili ed in particolare dell’IDE on-line Mbed. Passeremo quindi a caricare sulla board un piccolo programma di esempio per accendere un LED dal PC, e poi ci sarà una grande sorpresa finale! La guida non vuole essere esaustiva, ma dare le informazioni preliminari per prendere confidenza con la scheda e permettere di partire da subito con gli esperimenti. In coda darò una serie di link a documentazione tecnica per l’approfondimento.
Panoramica sulla serie Nucleo
Le nuove schede denominate Nucleo di ST, sono una nuova serie di schede a basso costo adatte alla creazione di veloci applicazioni con i microcontrollori STM32.
Le caratteristiche principali della serie sono:
- Microcontrollore: STM32
- Header compatibile con Arduino Uno rev. 3
- Header Morpho, estensione ST per l’accesso completo agli I/O STM32
- Programmatore/Debugger ST-LINK/V2-1 on-board che può anche essere usato separatamente alla scheda tramite il connettore SWD
- Può essere alimentata tramite connettore USB oppure tramite alimentazione esterna.
- Dispone di un LED utilizzabile dall’utilizzatore, oltre ad un LED per l’alimentazione e un LED tricolore per monitorare la comunicazione USB.
- Ha un pulsate utilizzabile dall’utente e uno di reset
STM32 è una famiglia di IC basata sul microcontrollore RISC a 32bit ARM Cortex-M7, Cortex-M4F, Cortex-M3, Cortex-M0+ e Cortex-M0. La tabella seguente riassume la famiglia STM32:
Serie STM32 | Core ARM |
---|---|
F7 | Cortex-M7 |
F4, F3, J | Cortex-M4F |
F2, F1, L1, W, J | Cortex-M3 |
L0 | Cortex-M0+ |
F0 | Cortex-M0 |
Il costo di queste schede si aggira intorno ai 10 euro l’una, il che le rende molto convenienti dal punto di vista di un Hobbista. La parte superiore della scheda è occupata dal Programmatore/Debugger ST-LINK/V2-1 che può anche essere rimosso, staccandolo dalla scheda microcontrollore vera e propria. In questo modo è possibile ridurre le dimensioni d’ingombro della scheda ma sarà necessario alimentare la scheda esternamente tramite gli header Arduino o Morpho. Inoltre per programmare il microcontrollore si dovrà connettere l’ST-LINK rimosso, tramite il connettore CN4 ai segnali SWD presenti sul connettore Morpho CN7 pin 15 e pin 13.
Io comunque consiglio di NON staccare il programmatore che ha anche la comoda funzione di convertitore seriale virtuale per la comunicazione con il PC. Inoltre il programmatore può essere usato stand alone anche senza la necessità di staccarlo, è sufficiente togliere i jumper su CN2 per poter programmare schede esterne tramite l’header SWD.
La porta USB ha 3 principali funzioni:
- Programmazione e debugging
- COM port virtuale
- Mass storage device per la programmazione drag’n’drop
Ora qualche parola va spesa sulle modalità di alimentazione della scheda. La scheda può essere alimentata tramite il connettore USB CN1. Una volta collegata al PC inizierà la fase di ‘enumerazione’ della porta. Se il PC è in grado di erogare tramite l’USB una corrente massima di 300mA, il LED LD3 della scheda si accende e il micro viene alimentato, altrimenti il LED non si accende e il micro non viene alimentato. In questo caso possiamo alimentare la scheda con un alimentatore esterno oppure è possibile, con il jumper JP1 chiuso , richiedere al PC una corrente massima di 100mA anziché 300mA. Inoltre se utilizziamo un carica batterie per cellulari con la porta USB per alimentare la scheda, visto che non ci sarà enumerazione della porta la scheda non verrà alimentata e il LED LD3 rimarrà spento, anche in questo caso dovremo chiudere il jumper JP1 prima di collegare l’USB per poter alimentare la scheda.
E’ possibile alimentare la scheda tramite VIN dai pin 8 di CN6 o pin 24 di CN7 con una tensione da 7V a 12V e una corrente massima di 800mA. Per alimentare dall’esterno la scheda è necessario spostare il jumper JP5 in posizione E5V, invece per l’alimentazione da USB la posizione sarà U5V. È inoltre necessario lasciare aperto JP1 e connettere l’USB dopo aver alimentato la scheda dall’esterno per poter eseguire la programmazione.
Con le stesse modalità può essere alimentata la scheda con un’alimentazione di 5V tramite ingresso E5V del pin 6 di CN7 a una corrente massima di 500mA. Inoltre è anche possibile alimentare la scheda a 3,3V tramite il pin 4 di CN6 e il pin 12 e pin 16 di CN7, ma è possibile solo se è stata tagliata la parte dell’ST-LINK oppure rimuovendo le resistenze da 0ohm SB2 e SB12.
Tabella riepilogativa delle possibilità di alimentazione della scheda:
Fonte | Ingresso | Tensione | Corrente MAX | JP1 | JP5 | ST-LINK e SB2-SB12 |
---|---|---|---|---|---|---|
PC con USB che può erogare 300mA | USB CN1 | 5V | 300mA | aperto | U5V | Non rimossi |
PC con USB che può erogare 100mA MAX | USB CN1 | 5V | 100mA | chiuso | U5V | Non rimossi |
Carica batterie USB | USB CN1 | 5V | Non specificato (consiglio <300mA) | chiuso | U5V | Non rimossi |
Alimentazione esterna | VIN (pin 8 di CN6 o pin 24 di CN7) | 7÷12V | 800mA | aperto | E5V | E possibile rimuovere ST-LINK ma non SB2-SB12 |
Alimentazione esterna | E5V (pin 6 di CN7) | 5V | 500mA | aperto | E5V | E possibile rimuovere ST-LINK ma non SB2-SB12 |
Alimentazione esterna | +3V3 (pin 4 di CN6, pin 12 e pin 16 di CN7) | 3,3V | Non specificato | indifferente | indifferente | Rimuovere l'ST-LINK o rimuovere SB2-SB12 |
Ho parlato già in precedenza dei jumper presenti su CN2, nella parte del programmatore, che se presenti consentono la programmazione della scheda, se rimossi permettono la programmazione di altre schede tramite l’header CN4. Il JP6 nominato IDD serve per misurare la corrente consumata dall’STM32, basta rimuovere il ponticello e collegare un amperometro. Ricordarsi poi di rimettere il jumper altrimenti il micro non sarà più alimentato.
Il CN3 è la connessione alla seriale virtuale dell’ST-LINK, e può essere usata nel caso si voglia monitorare una seriale diversa dalla standard, ma è necessario modificare alcune chiusure come descritto nel manuale della scheda. CN11 e CN12 sono solo dei contatti di massa e nella parte sottostante la scheda fanno da sostegno per la parte dell’ST-LINK, inoltre contengono 2 jumper non usati, utili per essere utilizzati all’occorrenza.
Il LED tricolore LD1 fornisce le informazioni sullo stato della comunicazione del ST-LINK:
- Lampeggia lentamente di rosso prima che l’USB sia inizializzata
- Lampeggia velocemente di rosso durante l’enumerazione della porta
- Rimane acceso fisso di rosso quando l’inizializzazione è completata
- Lampeggia rosso e verde durante la comunicazione tra scheda e PC
- Rimane acceso fisso il verde se la comunicazione finisce con successo
- Rimane acceso fisso l’arancione se la comunicazione fallisce
Il LED verde LD2 è collegato al I/O D13 del connettore Arduino.
Il LED rosso LD3 indica la presenza dei 5V di alimentazione.
Lo switch B1 anche nominato USER è connesso al I/O PC13.
Lo switch B2 è il reset della scheda
Caratteristiche della scheda STM32L053R8.
In particolare la scheda in omaggio alla Maker Faire 2014 è la STM32L053R8, con caratteristiche Ultra Low Power:
- Core Cortex-M0+ a 32MHz
- 64 KB di memoria Flash per la programmazione
- 8 KB SRAM
- 9 Timers
- ADC a 16 canali 12bit fino a 1.14 Msps
- DAC a singolo canale
- 2 I2C
- 2 USART
- 1 UART
- 2 SPI
Qui sotto il pinout della scheda.
Installazione driver e aggiornamento
Istalliamo i driver necessari al riconoscimento della scheda da parte del PC Windows.
I driver possono essere scaricati dal sito ST all’indirizzo http://www.st.com/web/en/catalog/tools/PF260218 per sistemi Windows Vista, 7 e 8, oppure all’indirizzo http://www.st.com/web/en/catalog/tools/PF260219 per Windows XP.
Scaricare anche il tool di upgrade dell’ ST-LINK all’indirizzo http://www.st.com/web/en/catalog/tools/PF260217 .
Una volta scaricati e scompattati i driver in una qualsiasi cartella del PC, eseguire il file dpinst_x86.exe se il vostro sistema operativo è a 32bit, oppure il file dpinst_amd64.exe se il vostro sistema è a 64bit.
Finita l’installazione potete collegare la Nucleo Board all’USB del PC, in questo modo verrà riconosciuta e verranno richiamati tutti i driver necessari. Alla fine del processo di installazione, nel PC troveremo un nuovo disco di nome NUCLEO di dimensione 80KB con all’interno un documento HTML che se aperto reindirizza alla pagina dedicata alla scheda nel sito mbed.org.
Nell’elenco delle periferiche troveremo anche installata una seriale virtuale con assegnata una porta COM, utile per la comunicazione con il PC. Consiglio di annotarsi il numero della porta COM.
Appena si accenderà il LED LD3 che indica che il micro è alimentato, verrà eseguito il programma di test caricato di fabbrica. Consiste nel far lampeggiare il LED LD2 (LED verde). Premendo il pulsante blu USER cambierà la modalità di lampeggio con tre modalità diverse.
E’ consigliabile, una volta finita l’installazione dei driver, eseguire l’aggiornamento del programmatore ST-LINK tramite il software di aggiornamento. Nella cartella dove avete scompattato il tool di aggiornamento scaricato al link che ho dato in precedenza, lanciate l’applicazione ST-LinkUpgrade e premere quindi Device Connect. Comparirà accanto alla dicitura “Firmware version” la versione attualmente installata, e sotto, accanto alla dicitura “Upgrade the firmware to”, l’ultima versione disponibile. Nell’immagine sottostante le due coincidono perché io ho già fatto l’aggiornamento che è irreversibile, ma se sono diverse è consigliato premere il tasto “Yes”, la barra sotto si riempirà gradualmente fino al completamento dell’operazione che richiede pochi secondi.
Panoramica degli IDE utilizzabili
A questo punto la scheda è pronta per poter accogliere i vostri programmi. Ma quale IDE (Integrated Development Environment) utilizzare?Abbiamo a disposizione diverse possibilità dalla quali non è semplice districarsi. Nel volantino all’interno della confezione della scheda e nel sito ufficiale vengono citati i seguenti IDE pienamente compatibili:
- IAR EWARM (www.iar.com): disponibile in versione di valutazione per 30 giorni oppure in versione Limited QuickStart con limitazione di 32KB di memoria programma (16KB su Cortex M0)
- Keil MDK (www.keil.com): disponibile in versione Lite con limitazione a 32KB
- Atollic TrueStudio (www.atollic.com): anche qui disponibile in versione limitata a 32KB (8KB su Cortex M0)
- Mbed (mbed.org): IDE on-line completamente gratuito e pienamente funzionante con tutta la serie Nucleo
Altri freeware non citati ufficialmente sembrerebbero essere compatibili con gli STM32, ma non ho ancora avuto l’opportunità di testarli (cosa che ho intenzione di fare). Tanto per citarne alcuni:
- Code::Blocks (www.codeblocks.org)
- Eclipse (eclipse.org)
- CooCox CoIDE (www.coocox.org)
Per il momento la scelta più semplice e rapida per iniziare da subito a programmare mi è sembrata Mbed. Con questo IDE possiamo programmare in C e C++. Mbed ha di positivo il fatto che si tratta di un editor online e quindi da qualsiasi computer, ma anche da smartphone, ho sempre tutti i miei programmi a disposizione e ci sono anche tanti buoni esempi di partenza. Di contro ha che per il momento non è possibile fare il debug del programma (per alcune schede non ST è invece possibile debuggare).
Descrizione e partenza con Mbed
Per partire con Mbed, una volta collegata la scheda al PC, aprite il disco di nome NUCLEO e fate doppio click su “mbed.html”. In alternativa, senza collegare la scheda al PC, andate all’indirizzo https://developer.mbed.org/ e cliccate in alto a destra su “Compiler”. Completata la procedura di registrazione al sito, si aprirà la pagina del compilatore.
Sulla sinistra, nel Program Workspace verranno elencati i nostri progetti. Al centro verrà visualizzato il contenuto di ciò che selezioniamo nella barra di sinistra, se per esempio selezioniamo un programma questa diventerà l’area di editing. Sulla destra invece verranno visualizzati dettagli aggiuntivi. In alto c’è la barra dei comandi con sulla destra il tasto Help con utili informazioni di aiuto.
Per il momento in alto a destra noterete la scritta “No device selected”, per selezionare la scheda a vostra disposizione clicchiamoci sopra per aprire la finestra di selezione.
Visto che non abbiamo ancora registrato nessuna scheda, nella parte in basso della finestra potremo cliccare solo su Add Platform. Verrà aperta una nuova pagina con le immagini di tutte le schede compatibili con Mbed. Sulla destra selezioniamo tra i Platform Vendor, STMicroelectronics.
Scegliamo la nostra scheda cliccando sopra l’immagine relativa (nel mio caso la L053R8).
Una volta aperta la pagina descrittiva dedicata alla scheda nucleo selezionata, sulla destra cliccate su “Add to your Mbed compiler” per registrare la scheda. Tornando sulla scheda del vostro browser con il compilatore e cliccando nuovamente in alto a destra su “No device selected”, troveremo la nostra scheda selezionabile, premere quindi in alto a destra su “Select Platform” per accettare la selezione.
Selezionata la scheda, vediamo come compilare e caricare un programma di esempio sulla NUCLEO Board. Nella barra dei comandi cliccare su NEW.
Nel campo template selezioniamo “Blinky LED test for the ST Nucleo boards” e clicchiamo OK. Tra i nostri programmi ora troviamo Nucleo_blink_led, clicchiamoci sopra per vedere al centro il contenuto. Facendo doppio clic su main.cpp vedremo il listato del nostro programma.
Adesso se non lo avete ancora fatto collegate la scheda al PC per poterla programmare, cliccate in alto su “Compile”. Finita la compilazione senza errori si aprirà una finestra di download del vostro browser, salvate il file all’interno del drive NUCLEO (ecco quando prima parlavo di programmazione drag’n drop: il file compilato va semplicemente caricato su disco virtuale creato dalla scheda!). Il led LD1 della scheda inizierà a lampeggiare verde e rosso per qualche secondo, poi si accenderà di colore verde indicando che la programmazione è avvenuta con successo. La scheda viene quindi resettata e inizia l’esecuzione del programma.
Volendo archiviare i nostri programmi nel computer locale nel formato già compilato con estensione .bin, possiamo salvare il file al momento del download in una cartella del nostro hard disk. Successivamente per programmare la scheda con uno dei nostri programmi è sufficiente copiare il file .bin nel drive NUCLEO… Più semplice di così!
Primo Programma
A questo punto siamo pronti per creare un nostro programma. Io vi propongo di partire con un programma che accende e spenge il led sulla scheda alla ricezione di un comando dalla seriale. Nei programmi di esempio possiamo già trovare un programma che utilizza la seriale per inviare una stringa al PC ma non c’è la funzione inversa di ricezione di un comando, quindi questo programma potrebbe essere utile come esempio.
Apriamo l’IDE Mbed come descritto sopra e clicchiamo su NEW. Stavolta su Template selezioniamo Empty Program, e diamo un nome al nostro programma su Program Name. Confermiamo cliccando su OK. Tornati all’IDE, selezioniamo il nostro programma nel Program Workspace e clicchiamo sul comando Import in alto accanto al comando New. Dalla scheda Libraries selezioniamo la libreria mbed ufficiale. Cliccando sul tasto Import in alto a destra si apre una finestra con le opzioni, non cambiare nulla e cliccare su Import. In questo modo abbiamo importato la libreria standard, che possiamo consultare aprendola sul Program Workspace, aprendo Classes:
Facendo clic su una classe potremo visualizzare la descrizione di utilizzo e del codice di esempio.
Adesso creiamo un nuovo file main.cpp dove scrivere il nostro codice, per fare questo selezioniamo nuovamente il nostro progetto nel Program Workspace, e clicchiamo nella freccetta accanto al tasto NEW, e successivamente su New file…, nominiamo il file main.cpp e confermiamo.
Scriviamo il seguente codice:
#include "mbed.h" DigitalOut myled(LED1); //definisce myled Serial pc(SERIAL_TX, SERIAL_RX); //Apertura della seriale 2 //Serial pc(D8, D2); //Apertura della seriale 1 *opzionale vedi sotto int main() { char c; // variabile che contiene il carattere appena ricevuto char buffer[128]; // buffer di accumulo dei caratteri in sequenza char i=0; // variabile di comodo per il conteggio dei caratteri while(1) { c=pc.getc(); //legge un carattere dalla seriale if (c != 13) { buffer[i]=c; // se il carattere è diverso da CarriageReturn (ASCII 13) lo memorizza nel buffer i++; // incrementa il puntatore al buffer }else{ buffer[i]=0; //se è un CR inserisci un carattere nullo nel buffer per delimitare la stringa i=0; //azzera la posizione del puntatore del buffer pronto per la ricezione di una nuova stringa if ((strcmp(buffer,"on")==0) // confronta la stringa ricevuta con le costanti accettate per il comando di accensione del led ||(strcmp(buffer,"acceso")==0) //la funzione strcmp fa parte della libreria string standard del C e confronta 2 stringhe ||(strcmp(buffer,"apriti sesamo")==0)){ //restituendo 0 se le stringhe sono uguali. myled = 1; //Accende il led } if ((strcmp(buffer,"off")==0) //Confronto per i comandi di spegnimento del led ||(strcmp(buffer,"spento")==0) ||(strcmp(buffer,"chiuditi sesamo")==0)){ myled = 0; // spegne il led } } } } |
Compilare il codice come abbiamo fatto in precedenza e caricarlo nel disco NUCLEO per programmare la scheda. A questo punto con un programma di emulazione di terminale (come il vecchio Hyperterminal o PuTTY, ma consiglio RS232 Terminal di Mauro Laurenti) impostare la comunicazione sulla COM creata dalla scheda NUCLEO a 9600 bauds, 8-bit data, no parity, 1 bit di stop (9600,8,N,1).
Digitando i comandi di accensione seguiti dal tasto invio il led sulla board si accenderà, digitando i comandi per lo spegnimento il led si spegnerà, secondo la seguente tabella:
Comando | Funzione |
---|---|
on | accende il led |
off | spegne il led |
acceso | accende il led |
spento | spegne il led |
apriti sesamo | accende il led |
chiuditi sesamo | spegne il led |
La chicca : inviare i comandi seriali sfruttando il riconoscimento vocale su Android su collegamento Bluetooth
La guida si può considerare conclusa, ma a questo punto vorrei lasciarvi con una piccola chicca finale. Con l’APP per Android che ho realizzato (per la quale è scaricabile il file APK in fondo all’articolo), è possibile accendere e spengere il led sulla scheda dando dei comandi vocali. L’intenzione è quella di dimostrare la possibilità di realizzare un robot guidato da comandi vocali inviati da uno smartphone Android via bluetooth.
L’APP che ho realizzato si occupa appunto di riconoscere i comandi vocali e inviare quindi una stringa di controllo via bluetooth. L’app l’ho realizzata con MIT App Inventor 2 di cui non parlerò qui, ma giusto per dare un’idea dirò che si tratta di un sistema di sviluppo a blocchi interamente online ideato dal MIT.
Per la comunicazione con la scheda NUCLEO ho utilizzato un convertitore Bluetooth/Seriale HC-06 che costa pochi euro ed è facilmente reperibile (anche su ebay). Per poterlo utilizzare con la scheda però ci sono più strade:
- La Nucleo è predisposta per utilizzare la Serial2 , disponibile sugli I/O PA_2 e PA_3, con l’ST LINK che fornisce la seriale virtuale tramite connessione USB al PC. Per poter utilizzare questa seriale con uno shield Arduino tramite gli I/O D0 e D1, è necessario aprire i ponticelli SMD SB13 e SB14 e chiudere i ponticelli SB62 e SB63 tramite l’utilizzo del saldatore. L’operazione è un po’ scomoda per un hobbista e a mio parere sarebbe stato meglio, da parte di ST, prevedere dei jumper appositi. Comunque una volta modificata la scheda è possibile ripristinare il collegamento con la seriale virtuale, una volta rimosso lo shield, collegando con 2 cavetti con terminali dupont il CN3 RX con D1 e CN3 TX con D0.
- Una seconda possibilità meno invasiva e più veloce è quella di usare un’altra porta seriale modificando leggermente il codice che ho proposto sopra. Se vogliamo ad esempio usare la Serial1 è sufficiente sostituire la riga:
Serial pc(SERIAL_TX, SERIAL_RX);
Con:
Serial pc(D8, D2);
A questo punto bisogna collegare il modulo Bluetooth HC-06 con il TX su D2 e l’RX su D8 del connettore Arduino.
Alimentando la NUCLEO con il modulo Bluetooth collegato, bisogna avviare il servizio bluetooth sullo smartphone, ricercare il dispositivo ed eseguire la procedura per la registrazione del dispositivo. Una volta registrato avviate l’APP precedentemente installata. Premere il comando Bluetooth Select, verrà visualizzato l’elenco dei dispositivi registrati dal quale selezionare il modulo HC-06. A questo punto se premiamo il tasto Speech verrà avviato il servizio di riconoscimento vocale di Google, e le parole che diremo verranno successivamente inviate via Bluetooth alla NUCLEO. Dando i comandi vocali come nella tabella proposta sopra, sarà quindi possibile far accendere e spegnere il led della scheda. Se vogliamo disconnettere il dispositivo per qualche motivo premiamo Disconnect.
Utilizzando questa semplice APP potrete implementare tutti i comandi che volete con la vostra scheda.
Ringraziamenti
In conclusione vorrei ringraziare Giovanni Bernardo per avermi ospitato nel sito SettoreZero che seguo da anni e che è ricco di spunti per i nostri progetti. Ringrazio anche tutti coloro che vorranno aggiungere commenti utili, richieste o critiche pertinenti.
Links e Downloads
Manuale d’uso (c’è anche lo schema elettrico): http://www.st.com/web/en/resource/technical/document/user_manual/DM00105823.pdf
Getting started con i vari IDE: http://www.st.com/web/en/resource/technical/document/user_manual/DM00105928.pdf
File di instalazione android APK: Bluetooth Voice Command (539 download)