Primi passi con la scheda microcontroller multicore Raspberry Pi Pico con l'uso di C
Contributo di Editori nordamericani di DigiKey
2023-06-07
Nei sistemi embedded vi è l'esigenza intrinseca di disporre di un'unità microcontroller (MCU) potente e a basso costo. Questi dispositivi svolgono un ruolo importante non solo per il prodotto, ma anche per il supporto ai test, alla prototipazione rapida e a funzionalità come l'apprendimento automatico (ML). Tuttavia, per iniziare a lavorare con gli MCU è generalmente necessaria una conoscenza approfondita della tecnologia MCU e dei linguaggi di programmazione di basso livello. Inoltre, le schede di sviluppo spesso costano tra i 20 e i 1.000 dollari, il che può essere troppo per molti sviluppatori. Inoltre, non sempre è disponibile una scheda di sviluppo e, anche qualora lo fosse, i progettisti spesso faticano a metterla in funzione.
Questo articolo presenta Raspberry Pi Pico (SC0915), una scheda di sviluppo a basso costo per MCU RP2040 che offre agli sviluppatori un'ampia gamma di funzionalità. L'articolo esplora Pico e alcune schede di espansione, esamina i diversi kit di sviluppo software supportati da Raspberry Pi Pico e spiega come creare un'applicazione con LED lampeggiante utilizzando l'SDK C.
Introduzione a Raspberry Pi Pico
Raspberry Pi Pico è stato introdotto nel 2021 come piattaforma di sviluppo per il microcontroller RP2040. Pico può essere utilizzato come scheda di sviluppo indipendente o può essere integrato in un prodotto grazie alle connessioni sui bordi che possono essere saldate a una scheda portante (Figura 1). Grazie al suo costo inferiore ai 5 dollari e al suo utilizzo polivalente, Pico è diventata una soluzione popolare sia per i maker sia per gli sviluppatori professionisti.
Figura 1: Raspberry Pi Pico è una scheda di sviluppo a basso costo con tutto l'occorrente per sviluppare applicazioni sul microcontroller RP2040. (Immagine per gentile concessione di Raspberry Pi)
RP2040 è dotato di un processore ARM® Cortex®-M0+ dual core con clock a 133 MHz e include fino a 264 kB di SRAM. RP2040 non include la flash su chip. Raspberry Pi Pico dispone invece di un chip flash esterno da 2 MB che comunica con RP2040 tramite un'interfaccia periferica seriale quadrupla (QSPI). La scheda dispone anche di un LED utente, di un oscillatore a cristallo che il circuito ad aggancio di fase (PLL) utilizza per creare un clock stabile della CPU ad alta velocità e di un pulsante per configurare l'avvio del processore, normalmente o in un bootloader.
Un ecosistema esteso
Raspberry Pi Pico dispone già di un ampio ecosistema che consente agli sviluppatori di scegliere se utilizzare i kit di sviluppo software MicroPython o C per scrivere applicazioni per la scheda. Una nota interessante su Raspberry Pi Pico è che non è disponibile una sola scheda di sviluppo. Sono invece tre: SC0915 originale con una configurazione standard, SC0917 che include connettori per basetta e SC0918 che include un chip Wi-Fi a basso costo per applicazioni connesse (Figura 2).
Figura 2: Raspberry Pi Pico è disponibile in tre configurazioni. (Immagine per gentile concessione di Beningo Embedded Group, LLC)
Per tutte queste versioni, l'ingombro generale della scheda rimane invariato. Le connessioni ai bordi della scheda sono a 40 pin per le periferiche e altre opzioni sono illustrate nella Figura 3. Queste includono l'alimentazione, la massa, un ricetrasmettitore asincrono universale (UART), un ingresso e un'uscita per uso generale (GPIO), la modulazione della larghezza di impulso (PWM), un convertitore analogico/digitale (ADC), un'interconnessione periferica seriale (SPI), un'interfaccia a circuito inter-integrato (I²C) e il debug.
Figura 3: La piedinatura ai bordi di Raspberry Pi Pico offre un'ampia gamma di opzioni di accesso alle periferiche. (Immagine per gentile concessione di Raspberry Pi)
Opzioni della scheda di breakout
Se Raspberry Pi viene utilizzato per la prototipazione rapida, è necessario accedere facilmente ai connettori ai bordi della scheda. Un'opzione consiste nel popolare le basette e utilizzare una basetta sperimentale. Tuttavia, questa soluzione può spesso generare un groviglio di fili, con il potenziale di errori. Esistono invece diverse opzioni per le schede di breakout che espandono i connettori ai bordi a interfacce di pronta disponibilità.
Ad esempio, la scheda del modulo Pico MM2040EV di Bridgetek divide la maggior parte dei connettori al bordo in connessioni maschio e femmina. Inoltre, è disponibile lo shield 103100142 per Pico di Seeed Studio che fornisce ciascuna interfaccia periferica come connettore. Ogni connettore ha piedinatura compatibile con le schede di espansione per aggiungere funzioni quali sensori inerziali, driver per motori e telemetri.
Programmare in C o in MicroPython?
I sistemi embedded sono tradizionalmente scritti in C, perché questo sistema è in grado di bilanciare il controllo di basso livello con approcci applicativi di sistema di livello superiore. Il problema del codice C oggi è che si tratta di un linguaggio di programmazione antiquato - ha cinquant'anni - che raramente viene insegnato in università. È anche troppo facile iniettare accidentalmente dei bug e causare danni. Nonostante questi potenziali problemi, C è il linguaggio preferito per la maggior parte dello sviluppo di sistemi embedded.
Un'alternativa all'uso di C, fornita dall'ecosistema Raspberry Pi Pico, è MicroPython. MicroPython è una porta di CPython progettata per funzionare su sistemi basati su MCU. Pur essendo indubbiamente un processore più pesante di C, è un linguaggio moderno con cui molti sviluppatori hanno familiarità e si trovano a proprio agio. MicroPython può astrarre i dettagli di basso livello dell'MCU e dell'hardware. Gli accessi hardware avvengono tramite interfacce di programmazione delle applicazioni (API) di alto livello, facili da apprendere, una caratteristica importante per i progetti con scadenze ravvicinate.
Nella scelta del kit di sviluppo software (SDK) da utilizzare - C o MicroPython - gli sviluppatori devono concentrarsi su esigenze specifiche. Rispetto a MicroPython, l'uso di C offre l'accesso di basso livello ai registri dell'MCU, ha requisiti di memoria inferiori ed è più efficiente.
Impostazione dell'SDK C
Quando si utilizza l'SDK C per creare un'applicazione con LED lampeggiante, esistono diverse opzioni. La prima esamina la documentazione dell'SDK e segue le istruzioni. La seconda consiste nell'utilizzare un contenitore Docker preimpostato per installare automaticamente tutti gli strumenti necessari per iniziare. Una terza opzione consiste nell'installare manualmente i toolchain e il codice di esempio di Raspberry Pi Pico, tra cui:
- Git
- Python 3
- Cmake
- gcc-arm-none-eabi \
- libnewlib-arm-none-eabi
Per richiamare il codice di esempio di Raspberry Pi Pico è possibile clonare il repository git di Raspberry Pi utilizzando il seguente comando:
git clone https://github.com/raspberrypi/pico-sdk /home/sdk/pico-sdk && \
cd /home/sdk/pico-sdk && \
git submodule update --init &&
Una volta installate queste librerie e il codice sorgente, il passo successivo consiste nell'esplorare e compilare un'applicazione per il LED lampeggiante.
Scrivere una prima applicazione blinky
L'SDK C è corredato da un esempio che gli sviluppatori possono utilizzare per creare la loro prima applicazione. Il seguente listato di codice utilizza il LED integrato di Pico e l'istruzione PICO_DEFAULT_LED_PIN per impostare un pin di I/O e farlo lampeggiare con un ritardo di 250 millisecondi.
Copy
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pico/stdlib.h"
int main() {
#ifndef PICO_DEFAULT_LED_PIN
#warning blink example requires a board with a regular LED
#else
const uint LED_PIN = PICO_DEFAULT_LED_PIN;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
}
#endif
}
Listato di codice: Raspberry Pi Pico utilizza l'istruzione PICO_DEFAULT_LED_PIN per impostare un pin di I/O e farlo lampeggiare con un ritardo di 250 ms. (Codice per gentile concessione di Raspberry Pi)
Secondo il listato, a LED_PIN viene assegnato il pin predefinito; quindi vengono effettuate le chiamate alle API gpio in C. gpio_init serve per inizializzare il pin, mentre gpio_set_dir serve per impostare LED_PIN su un'uscita. Viene quindi creato un ciclo infinito che commuta lo stato del LED ogni 250 ms.
Compilare l'applicazione è relativamente semplice. Anzitutto, lo sviluppatore deve creare una directory di compilazione nella cartella di Raspberry Pi Pico utilizzando i seguenti comandi:
mkdir build
cd build
Successivamente, si deve predisporre cmake per la compilazione eseguendo il seguente comando:
cmake
Ora, uno sviluppatore può passare alla directory di blinky ed eseguire make:
cd blink
make
Il risultato del processo di compilazione sarà un file blinky.uf2. Il programma compilato può essere caricato su Raspberry Pi Pico tenendo premuto il pin BOOTSEL e accendendo la scheda. RP2 apparirà quindi come un dispositivo di archiviazione di massa. Lo sviluppatore deve trascinare il file blinky.uf2 sull'unità, a questo punto il bootloader installerà l'applicazione. Al termine, il LED dovrebbe iniziare a lampeggiare.
Conclusione
Raspberry Pi Pico è una soluzione interessante per gli sviluppatori embedded che cercano flessibilità nel ciclo di sviluppo. Offre diverse opzioni, tra cui soluzioni standalone o schede con connettività wireless. Inoltre, l'ecosistema supporta C e C++, oltre a MicroPython. Gli sviluppatori possono scegliere il linguaggio più adatto alla loro applicazione e sfruttare l'SDK corrispondente per accelerare lo sviluppo software.
Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.




