Noțiuni de bază pentru a începe cu placa de microcontroler Raspberry Pi Pico cu nuclee multiple folosind C

By Jacob Beningo

Contributed By DigiKey's North American Editors

Există o nevoie inerentă în sistemele încorporate de a avea o unitate de microcontroler (MCU) puternică și ieftină. Aceste dispozitive joacă un rol important nu doar în ceea ce privește produsul, ci și în susținerea testelor, a prototipurilor rapide și a unor capacități precum învățarea automată (ML). Cu toate acestea, pentru a începe utilizarea MCU este nevoie, în general, de o înțelegere aprofundată a tehnologiei MCU și a limbajelor de programare de nivel scăzut. În plus, plăcile de dezvoltare costă adesea între 20 USD și 1000 USD, ceea ce poate fi prea scump pentru mulți dezvoltatori. De asemenea, nu întotdeauna este disponibilă o placă de dezvoltare și, chiar și atunci când este disponibilă, proiectanții se străduiesc adesea să o pună în funcțiune.

Acest articol prezintă Raspberry Pi Pico (SC0915) ca o placă de dezvoltare ieftină pentru MCU RP2040 care oferă dezvoltatorilor o gamă largă de capabilități. Articolul prezintă Pico și unele plăci de expansiune, examinează diferitele kituri de dezvoltare software pe care le acceptă Raspberry Pi Pico și demonstrează cum se creează o aplicație cu leduri intermitente utilizând SDK-ul C.

Introducere în Raspberry Pi Pico

Raspberry Pi Pico a fost introdus pentru prima dată în 2021 ca platformă de dezvoltare pentru microcontrolerul RP2040. Pico poate fi utilizată ca o placă de dezvoltare independentă sau poate fi proiectată direct într-un produs datorită conexiunilor periferice care pot fi lipite pe o placă suport (Figura 1). Datorită costului de sub 5 USD al Pico și utilizării sale multifuncționale, acesta a devenit o soluție populară atât pentru producători, cât și pentru dezvoltatorii profesioniști.

Imagine cu Raspberry Pi Pico care este o placă de dezvoltare ieftinăFigura 1: Raspberry Pi Pico este o placă de dezvoltare ieftină care conține tot ce este necesar pentru a dezvolta aplicații pe microcontrolerul RP2040. (Sursa imaginii: Raspberry Pi)

RP2040 dispune de un procesor Arm® Cortex®-M0+ cu două nuclee, sincronizat la 133 megahertzi (MHz) și include până la 264 kiloocteți (Kbytes) de SRAM. RP2040 nu include flash pe cip. În schimb, Raspberry Pi Pico oferă un cip flash extern de 2 megaocteți (Mbyte) care se interfațează cu RP2040 prin intermediul unei interfețe periferice seriale cvadruple (QSPI). De asemenea, placa oferă un led de utilizator, un oscilator cu cristal pe care bucla de blocare a fazei (PLL) îl folosește pentru a crea un ceas CPU stabil de mare viteză și un buton de apăsare pentru a configura dacă procesorul pornește în mod normal sau într-un bootloader.

Un ecosistem extins

Raspberry Pi Pico dispune deja de un ecosistem extins care permite dezvoltatorilor să aleagă între kiturile de dezvoltare software MicroPython sau C pentru a scrie aplicații pentru placă. O notă interesantă cu privire la Raspberry Pi Pico este faptul că nu este disponibil doar o singură placă de dezvoltare. În schimb, există trei: SC0915 original, cu o configurație standard, SC0917, care include conectori de reglete, și SC0918, care include un cip Wi-Fi ieftin pentru aplicații conectate (Figura 2).

Imagine cu Raspberry Pi Pico care este disponibil în trei configurațiiFigura 2: Raspberry Pi Pico este disponibil în trei configurații. (Sursa imaginii: Beningo Embedded Group, LLC)

Pentru fiecare dintre aceste versiuni, amprenta generală a plăcii rămâne aceeași. Conexiunile periferice pentru placă constau în conexiuni periferice cu 40 de pini pentru perifericele și opțiunile de conectare prezentate în Figura 3. Acestea includ alimentare, masă, un receptor și emițător universal asincron (UART), intrare și ieșire de uz general (GPIO), modulare în lățime a impulsurilor (PWM), un convertor analogic-digital (ADC), o interfață periferică serială (SPI), o interfață de circuit inter-integrat (I2C) și depanare.

Imaginea schemelor pinilor conectați la periferie ale Raspberry Pi Pico (faceți clic pentru mărire)Figura 3: Schemele pinilor conectați la periferie ale Raspberry Pi Pico oferă o mare varietate de acces la periferice. (Sursa imaginii: Raspberry Pi)

Opțiuni de placă Breakout

Atunci când Raspberry Pi va fi utilizat pentru prototipuri rapide, este necesar să se obțină acces ușor la conectorii periferici ai plăcii. O opțiune pentru accesarea acestora este de a popula regletele și de a utiliza o placă breadboard. Cu toate acestea, această soluție poate duce adesea la o încurcătură de fire care poate genera erori. În schimb, există mai multe opțiuni pentru plăcile breadboard care extind conectorii periferici la interfețe mai ușor disponibile.

De exemplu, placa de module Pico MM2040EV de la Bridgetek separă majoritatea conectorilor periferici în conexiuni de tip pin și socket. În plus, există scutul 103100142 pentru Pico de la Seeed Studio, care oferă fiecare interfață periferică sub forma unui conector. Fiecare conector are pinii compatibili cu plăcile de expansiune pentru a adăuga funcții precum senzori inerțiali, drivere de motor și telemetre.

C sau MicroPython?

În mod tradițional, sistemele încorporate au fost scrise în C, deoarece acesta asigură un echilibru între controlul de nivel scăzut și abordările de nivel superior ale aplicațiilor de sistem. Problema cu C în prezent este că este un limbaj de programare învechit, vechi de cincizeci de ani, care este rareori predat în universități. De asemenea, este prea ușor să introduci accidental erori și să provoci daune. În ciuda acestor probleme potențiale, C este limbajul ales pentru majoritatea dezvoltării sistemelor încorporate.

O alternativă la utilizarea C, oferită de ecosistemul Raspberry Pi Pico, este MicroPython. MicroPython este un port CPython conceput pentru a rula pe sisteme bazate pe MCU. Deși este, fără îndoială, un procesor mai greu de utilizat decât C, este un limbaj modern cu care mulți dezvoltatori sunt familiarizați și se simt confortabil. MicroPython poate face abstracție de detaliile de nivel scăzut ale MCU și ale hardware-ului. Accesarea hardware-ului se face prin intermediul unor interfețe de programare a aplicațiilor (API) de nivel înalt, care sunt ușor de învățat – o caracteristică importantă în cazul unor termene limită strânse pentru proiecte.

Atunci când selectează kitul de dezvoltare software (SDK) pe care să îl utilizeze – C sau MicroPython – dezvoltatorii trebuie să se concentreze asupra unor nevoi specifice. În comparație cu MicroPython, utilizarea C va oferi acces de nivel scăzut la registrele MCU, va avea o amprentă de memorie mai mică și va fi mai eficientă.

Configurarea SDK-ului C

Atunci când utilizați SDK-ul C pentru a crea o aplicație cu leduri intermitente, există mai multe opțiuni. Prima este să consultați documentația SDK și să urmați instrucțiunile. A doua este de utilizarea unui container Docker predefinit pentru a instala automat toate instrumentele necesare pentru a începe. O a treia opțiune este instalarea manuală a lanțurilor de instrumente și a codului de exemplu Raspberry Pi Pico, inclusiv:

  • Git
  • Python 3
  • Cmake
  • gcc-arm-none-eabi \
  • libnewlib-arm-none-eabi

Recuperarea codului de exemplu pentru Raspberry Pi Pico poate fi efectuată prin clonarea repo-ului git al Raspberry Pi folosind următoarea comandă:

git clone https://github.com/raspberrypi/pico-sdk /home/sdk/pico-sdk && \

     cd /home/sdk/pico-sdk && \

    git submodule update --init &&

Odată ce aceste biblioteci și codul sursă sunt instalate, următorul pas este să explorăm și să compilăm o aplicație blinky LED.

Scrierea unei prime aplicații blinky

SDK-ul C este însoțit de un exemplu de tip „blinky” pe care dezvoltatorii îl pot folosi pentru a crea prima lor aplicație. Lista de coduri de mai jos folosește ledul de la bordul Pico și directiva PICO_DEFAULT_LED_PIN pentru a configura un pin de intrare/ieșire și a-l face să clipească cu o întârziere de 250 de milisecunde (ms).

Copiați
	/**
	 * 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
	}

Listarea codurilor: Raspberry Pi Pico utilizează directiva PICO_DEFAULT_LED_PIN pentru a configura un pin de intrare/ieșire și pentru a-l face să clipească cu o întârziere de 250 ms. (Sursa codului: Raspberry Pi)

Conform listei, pinului LED_PIN i se atribuie pinul implicit; apoi se fac apeluri la API-urile gpio C. gpio_init este utilizat pentru a inițializa pinul, în timp ce gpio_set_dir este utilizat pentru a seta LED_PIN la o ieșire. Se creează apoi o buclă infinită care comută starea ledului la fiecare 250 ms.

Compilarea aplicației este relativ simplă. În primul rând, un dezvoltator trebuie să creeze un director de construire în folderul Raspberry Pi Pico folosind următoarele comenzi:

mkdir build

cd build

În continuare, cmake trebuie să fie pregătit pentru compilare prin executarea următoarei comenzi:

cmake

Acum, un dezvoltator se poate muta în directorul blinky și poate rula make:

cd blink

make

Rezultatul procesului de construire va fi un fișier blinky.uf2. Programul compilat poate fi încărcat pe Raspberry Pi Pico ținând apăsat pinul BOOTSEL și alimentând placa. RP2 va apărea apoi ca un dispozitiv de stocare în masă. Dezvoltatorul trebuie să tragă fișierul blinky.uf2 pe unitate, moment în care bootloaderul va instala aplicația. Odată finalizat, ledul ar trebui să înceapă să clipească.

Concluzie

Raspberry Pi Pico este o soluție atractivă pentru dezvoltatorii de aplicații încorporate care caută flexibilitate în ciclul lor de dezvoltare. Sunt disponibile mai multe opțiuni, inclusiv soluții independente sau plăci cu conectivitate wireless. În plus, ecosistemul acceptă C și C++, precum și MicroPython. Dezvoltatorii pot alege limbajul care se potrivește cel mai bine aplicației lor și apoi pot folosi SDK-ul corespunzător pentru a accelera dezvoltarea de software.

DigiKey logo

Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.

About this author

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo is an embedded software consultant. He has published more than 200 articles on embedded software development techniques, is a sought-after speaker and technical trainer, and holds three degrees, including a Masters of Engineering from the University of Michigan.

About this publisher

DigiKey's North American Editors