venerdì 26 Aprile 2024
Home / Senza categoria / Usare Raspberry Pi Pico con C o C++
Pico coding

Usare Raspberry Pi Pico con C o C++

Come detto nella guida precedente di primo approccio al Raspberry Pi Pico, questo micocontrollore può essere programmato in due modi diversi: Con C (o C++), oppure con MicroPython.

Usando un linguaggio compilato come C o C++ si può sfruttare fino all’ultima goccia la potenza dell’hardware, mentre con MicroPython è velocissimo scrivere script che vengono eseguiti al volo e volendo si può programmare anche con dei blocchi visuali. Questa guida è incentrata all’approccio con l’utilizzo del linguaggio C (a proposito, non perdete il nostro corso gratuito di C)!  Vuoi invece esplorare la programmazione del Pico in MicroPython? Leggi la guida parallela a questa!

Iniziamo, in C !

Per poter controllare e programmare il Pico con il C, è necessario prima preparare il sistema che utilizzeremo per programmare (noi useremo un computer Raspberry Pi), configurando ed installando le dipendenze necessarie, relative al Pico. Questo possiamo farlo a mano oppure è possibile utilizzare una script bash che, in automatico, lo faccia per noi.

Lo script

lo trovate al seguente indirizzo:

https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh

Una volta scaricato, per mandarlo in esecuzione è necessario renderlo eseguibile. Per farlo, lanciate, nel Terminale, il comando chmod +x pico_setup.sh

Questo script farà le seguenti cose:

  • Creerà una directory chiamata pico all’interno della directory in cui vi trovate. D’ora in avanti daremo per scontato che pico sia stata creata sotto /home/pi
  • Installerà tutte le dipendenze necessarie
  • Farà il download in locale dei seguenti archivi: pico-sdk, pico-examples, pico-extra, pico-playground
  • Definirà nel vostro .bashrc le seguenti variabili di ambiente: PICO_SDK_PATH, PICO_EXAMPLES_PATH, PICO_EXTRAS_PATH, PICO_PLAYGROUND_PATH
  • SCaricherà e creerà picotool, per lavorare con il Pico in un terminale alfanumerico da riga di comando e picoprobe per interfacciare 2 Pico tra di loro e debuggare il secondo tramite il primo
  • Installerà OpenOCD, sempre per facilitare il debug
  • Installerà e configurerà per il Pico Visual Studio Code 
  • Configurerà nel Raspberry la porta UART per poter comunicare con il Pico

Cmake

Da un esame della directory pico-example, emerge che per compilare i vari esempi, si usa il comando cmake. Si tratta di un programma che tramite delle istruzioni che i programmatori codificano in file chiamati CMakeList.txt, consentono di verificare se la macchina su cui si installerà il software disponga di tutte le dipendenze e prepara l’ambiente per generare l’eseguibile. 

La spiegazione di cmake è al di fuori dello scopo di questo documento, ma si può sempre pensare di utilizzarlo a nostro vantaggio. Possiamo modificare gli esempi proposti, che possono essere considerati come dei suggerimenti, ed ampliarli secondo la nostra fantasia, e per generarli, continueremo ad usare la procedura che di seguito verrà illustrata.

Ovviamente in rete poi ci sono ottimi tutorial (la maggior parte però è in lingua inglese) con i quali approfondire la conoscenza di cmake

Compiliamo!

Adesso vedremo tutti i passi da seguire per costruire la semplice applicazione che fa lampeggiare il led presente a bordo della scheda del Pico. Useremo questo esempio di programma molto semplice, allo scopo di illustrare la procedura.

Come costruire blink

  • La prima cosa da fare è entrare nella directory /home/pi/pico/pico-example
  • Creare la directory build con il comando: mkdir build (se avete usato lo script pico_setup.sh probabilmente la troverete già. Per poter seguire allora questa guida, salvatela in un archivio con il comando tar cvzf build.tgz ./build che genererà il file build.tgz, cancellate la directory con il comando rm -rf build e proseguite secondo questa guida. Volendo potrete sempre tornare indietro cancellando la vostra build e ripristinando quella originale con il comando tar xvzf build.tgz)
  • Entrare dentro alla directory build ed eseguire il comando: cmake ..
  • In questo momento, sotto build saranno apparse tante directory quanti sono gli esempi, pronti per essere costruiti
  • Entriamo nella directory build ed eseguiamo il comando: make -j4
  • Il comando precedente, appoggiandosi al file Makefile, costruito dal cmake, genera l’eseguibile da far girare nel Pico. Il -j4 consente di velocizzare tutto il processo in quanto la Raspberry Pi dispone di 4 core (eseguite il comando nproc per verificare) ossia 4 processori che possono lavorare in parallelo.
  • A questo punto nella directory corrente saranno presenti vari file, ma quello che ci interessa è blink.uf2

Come mandare in esecuzione blink sul Pico

Sebbene sia possibile fare tutto da riga di comando, per ora noi useremo l’interfaccia grafica.

  • Seguire le istruzioni riportate nella guida precedente su come montare correttamente il Pico.. Sul desktop dovrebbe comparirvi un’icona con nome RPI-RP2
  • A questo punto tramite il File Manager, cercate la directory /home/pi/pico/fico-examples/build/blink e tramite il mouse prendete il file blink.uf2 e trascinatelo su RPI-RP2.
  • Immediatamente il Pico si riavvierà mandando in esecuzione il programma che farà lampeggiare il led presente sulla scheda del microcontrollore.
  • Se non inserirete un altro programma, tutte le volte che collegherete il Pico alla Raspberry Pi (senza seguire le istruzioni riportate precedentemente), o all’alimentazione, ripartirà sempre l’ultimo codice che aveva girato in precedenza. 

  Ecco fatto!

Pico Euro

Codice Morse con Pico

Iniziamo subito ad utilizzare il nostro Pico in un progetto più concreto.

Vediamo come far lampeggiare il led ospitato sulla piastra del microcontrollore  secondo il famoso Codice Morse.

Si tratta di un esempio di quelli contenuti nella collezione di esempi relativi al Pico. Riporteremo di seguito il codice e lo analizzeremo nel suo complesso.

Descrizione del codice

Prima alcune particolarità.

Le funzioni sono riportate in ordine inverso di utilizzo e quindi sono auto dichiaranti (non sono utilizzati i prototipi).

E’ utilizzato 2 volte un particolare costrutto for che manca del primo argomento: serve per scandire i vari elementi di un vettore, senza conoscerne la lunghezza.

Adesso iniziamo ad analizzare il codice.

  • Righe 8-10: inclusione di headers standard e relativi al pico, con la definizione delle costanti e le funzioni scritte per accedere al microcontrollore
  • Riga 12: definizione di un periodo di tempo utilizzato per controllare l’accensione e lo spegnimento del led
  • Riga 14: definizione dell’alfabeto Morse. Notate che esiste una corrispondenza numerica tra indice del vettore e lettera. 0 -> A, 1 -> B etc. Inoltre non c’è distinzione tra maiuscole e minuscole.
  • Riga 44: put_morse_letter è la funzione che traduce i simboli dell’alfabeto Morse in tempi di lampeggiamento. In ingresso alla funzione c’è il numero intero che corrisponde al led da far lampeggiare ed una stringa che contiene una lettera di simboli Morse (punti e linee). La funzione scandisce il vettore di ingresso tramite un costrutto for ed ad ogni giro si accende il led tramite la funzione gpio_put(led_pin,1) se si tratta di un punto, si arresta l’esecuzione per 100 millisecondi (#define di Riga 12) altrimenti (simbolo linea) per 300 millisecondi. Subito dopo si spegne il led gpio_put(led_pin,0)) e si aspetta per altri 100 millisecondi. Quindi si passa al simbolo seguente. Quando la lettera finisce, si aspettano ancora 200 millisecondi e poi la funzione termina
  • Riga 60: put_morse_str questa è la funzione che traduce il messaggio da caratteri in punti e linee. Si utilizza un interessante algoritmo per recuperare i simboli dell’alfabeto Morse. Abbiamo visto che a 0 corrisponde la A, 1 la B etc. La funzione utilizza la rappresentazione numerica dei caratteri che rispetta la codifica ASCII. Consultando detta tabella possiamo verificare che ad A corrisponde 65, a B 66 fino alla Z che è 90. Proseguendo vediamo che a è 97, b è 98 fino a z che è 122. La funzione allora separa le lettere tra maiuscole e minuscole e nel caso di lettera maiuscolo, considera il simbolo dell’alfabeto Morse corrispondente all’espressione *str – ‘A’. Qualora il carattere *str sia proprio A, l’espressione corrisponde a 65-65 che è 0 e nell’alfabeto Morse individua la sequenza punto linea. Analogamente per B che sarebbe 66-65 = 1 (linea punto punto). Nel caso di lettere minuscole, invece del carattere maiuscolo si usa ‘a’  e la procedura si ripete. Per uno spazio si ferma l’esecuzione per 400 millisecondi.
  • Riga 79: main siamo arrivati alla funzione principale. Il costrutto #ifndef #else #endif, verifica se il nostro Pico ha a bordo il led. In caso contrario non esegue il codice. Prima di proseguire, osserviamo come anche i led siano considerati a bordo del Pico come GPIO ossia general pourpose input output. Per questo motivo devono essere inizializzati e definire il verso in cui si considerano (input o output). Quindi, qualora il test è superato, si inizializza la variabile LED_PIN a PICO_DEFAULT_LED_PIN che individua il led presente sulla scheda. Quindi si inizializza il led con l’istruzione gpio_init(LED_PIN), se ne definisce il verso (gpio_set_dir(LED_PIN, GPIO_OUT)) e poi  si inizia un loop infinito. In questo loop si richiama put_morse_str che a sua volta richiama put_morse_letter.   Lettera per lettera allora si traducono i vari caratteri in simboli che accedono e spengono il led a bordo del Pico. Finita la decodifica del messaggio, si aspetta un secondo e poi si ricomincia

Questa è in sintesi l’interpretazione del codice relativo alla demo contenuta nella raccolta di esempi denominato blinky

Pico

Vuoi capire come invece come programmare il Pico in MicroPython? Leggi la guida parallela a questa!

Raspberry Pi Pico si può acquistare presso i rivenditori ufficiali come Melopero, a circa 4,50€

Se vuoi restare aggiornato, seguici anche sui nostri social: FacebookTwitterYoutube

Se vuoi anche trovare prodotti e accessori Raspberry Pi in offerta, seguici anche su Telegram!!

A proposito di arkkimede

Vedi Anche

MagPi134 doppiapagina

MagPi in Italiano! Presentazione Raspberry Pi 5

Estratto, tradotto in italiano, di The MagPi N°134, la rivista ufficiale della Fondazione Raspberry Pi.

Powered by themekiller.com