Pierwsze kroki z wielordzeniową płytką mikrokontrolera Raspberry Pi Pico przy użyciu języka C

Przez: Jacob Beningo

Przekazane przez: Północnoamerykańscy redaktorzy DigiKey

Systemy wbudowane nie mogą się obyć bez wydajnych i niedrogich mikrokontrolerów MCU. Urządzenia te odgrywają ważną rolę nie tylko w produkcie, ale także we wspieraniu prób, szybkiego prototypowania i możliwości takich jak uczenie maszynowe (ML). Jednak pierwsze kroki z mikrokontrolerami MCU zazwyczaj wymagają dogłębnego zrozumienia technologii MCU i języków programowania niskiego poziomu. Ponadto płytki rozwojowe często kosztują od 20 do 1000 dolarów, co może być zbyt drogie dla wielu programistów. Poza tym płytka rozwojowa nie zawsze jest dostępna, a nawet jeśli jest, projektanci często mają problem z jej uruchomieniem.

W tym artykule przedstawiono Raspberry Pi Pico (SC0915) jako niedrogą płytkę rozwojową dla mikrokontrolera MCU RP2040, która udostępnia deweloperom bogate możliwości. W artykule omówiono Pico i niektóre karty rozszerzeń, zbadano różne zestawy rozwojowe oprogramowania obsługiwane przez Raspberry Pi Pico i pokazano, jak przygotować aplikację z migającą diodą LED za pomocą zestawu rozwojowego oprogramowania (SDK) w języku C.

Wprowadzenie do Raspberry Pi Pico

Płytka Raspberry Pi Pico została po raz pierwszy wprowadzona w 2021 roku jako platforma rozwojowa dla mikrokontrolera RP2040. Płytki Pico można używać jako autonomicznej płytki rozwojowej lub można zaprojektować użycie jej bezpośrednio w produkcie dzięki złączom krawędziowym, które można przylutować do płytki nośnej (ilustracja 1). Ponieważ płytka Pico kosztuje niecałe 5 dolarów i jest komponentem wielozadaniowym, stała się popularnym rozwiązaniem wśród producentów i profesjonalnych deweloperów.

Ilustracja przedstawiająca Raspberry Pi Pico - niedrogą płytkę rozwojowąIlustracja 1: Raspberry Pi Pico to niedroga płytka rozwojowa, która zawiera wszystko, co niezbędne do tworzenia aplikacji na mikrokontrolerze RP2040. (Źródło ilustracji: Raspberry Pi)

Mikrokontroler RP2040 zawiera dwurdzeniowy procesor Arm® Cortex®-M0+ taktowany częstotliwością 133MHz oraz pamięć SRAM do 264kB. RP2040 nie zawiera wbudowanej pamięci flash. Zamiast tego Raspberry Pi Pico zapewnia zewnętrzny układ flash o pojemności 2MB, który łączy się z RP2040 przez poczwórny szeregowy interfejs urządzeń peryferyjnych (QSPI). Płytka zawiera również diodę LED do wykorzystania przez użytkownika, oscylator kwarcowy używany przez pętlę synchronizacji fazowej (PLL) do tworzenia stabilnego, szybkiego zegara procesora oraz przycisk do konfigurowania, czy procesor uruchamia się normalnie, czy w programie ładującym.

Rozbudowany ekosystem

Raspberry Pi Pico ma już rozbudowany ekosystem, który pozwala deweloperom wybierać między używaniem zestawów rozwojowych oprogramowania w języku MicroPython lub C do pisania aplikacji dla płytki. Ciekawostką na temat Raspberry Pi Pico jest to, że nie jest dostępna tylko jedna płytka rozwojowa. Zamiast tego są trzy: oryginalna SC0915 ze standardową konfiguracją, SC0917, która zawiera złącza listwowe, oraz SC0918, która zawiera tani układ Wi-Fi do aplikacji połączonych (ilustracja 2).

Ilustracja przedstawiająca płytkę Raspberry Pi Pico, która jest dostępna w trzech konfiguracjachIlustracja 2: płytka Raspberry Pi Pico jest dostępna w trzech konfiguracjach. (Źródło ilustracji: Beningo Embedded Group, LLC)

Dla każdej z tych wersji ogólny rozmiar płytki pozostaje taki sam. Złącza krawędziowe płytki to złącza 40-wtykowe do podłączania peryferiów i opcji połączeniowych przedstawionych na ilustracji 3. Należy do nich zasilanie, uziemienie, uniwersalny asynchroniczny odbiornik i nadajnik (UART), wejście i wyjście ogólnego przeznaczenia (GPIO), modulacja szerokości impulsu (PWM), przetwornik analogowo-cyfrowy (ADC), szeregowy interfejs urządzeń peryferyjnych (SPI), układ komunikacji I2C i debugowanie.

Ilustracja przedstawiająca płytkę Raspberry Pi Pico z krawędziowym układem wtyków (kliknij, aby powiększyć)Ilustracja 3: krawędziowy układ wtyków połączeniowych w płytce Raspberry Pi Pico zapewnia możliwość współpracy z różnymi peryferiami. (Źródło ilustracji: Raspberry Pi)

Opcje płytek rozdzielczych

Gdy płytka Raspberry Pi ma być wykorzystywana do szybkiego prototypowania, konieczne jest uzyskanie łatwego dostępu do jej złączy krawędziowych. Jedną z opcji dostępu do nich jest wykorzystanie listew i użycie płytki prototypowej. Jednak to rozwiązanie często może powodować bałagan w przewodach, który może prowadzić do błędów. Zamiast tego istnieje kilka opcji płytek rozdzielczych, które rozbudowują złącza krawędziowe o łatwiej dostępne interfejsy.

Na przykład płytka modułu Pico o oznaczeniu MM2040EV firmy Bridgetek konwertuje większość złączy krawędziowych na złącza wtykowo-gniazdowe. Dodatkowo dostępna jest nakładka 103100142 dla płytki Pico firmy Seeed Studio, która udostępnia poszczególne interfejsy urządzenia peryferyjnego jako złącza. Wtyki każdego złącza są kompatybilne z płytkami rozszerzeń i umożliwiają dodawanie takich funkcji, jak czujniki inercyjne, sterowniki silników i dalmierze.

Wybrać C, czy MicroPython?

Systemy wbudowane były tradycyjnie pisane w języku C, ponieważ równoważy on kontrolę niskiego poziomu z podejściami do aplikacji systemowych wyższego poziomu. Obecnie problem z C polega na tym, że jest to przestarzały, pięćdziesięcioletni język programowania, którego rzadko naucza się na uniwersytetach. Zbyt łatwo jest też przypadkowo wprowadzić błędy i spowodować szkody. Pomimo tych potencjalnych problemów język C jest preferowanym językiem dla większości systemów wbudowanych.

Alternatywą dla C, dostarczaną przez ekosystem Raspberry Pi Pico, jest MicroPython. MicroPython to port języka CPython przeznaczony do pracy w systemach opartych na mikrokontrolerach MCU. Chociaż niewątpliwie bardziej obciąża procesor niż C, jest to nowoczesny język, z którym wielu programistów jest zaznajomionych i czuje się komfortowo. MicroPython może abstrahować niskopoziomowe szczegóły mikrokontrolera MCU i sprzętu. Dostęp sprzętowy odbywa się za pośrednictwem interfejsów programowania aplikacji (API) wysokiego poziomu, których można się łatwo nauczyć - jest to ważna funkcja przy napiętych terminach projektu.

Określając, który zestaw rozwojowy oprogramowania (SDK) należy wybrać - C czy MicroPython - deweloperzy muszą się skupić na określonych potrzebach. W porównaniu z MicroPythonem użycie języka C zapewni niskopoziomowy dostęp do rejestrów mikrokontrolera MCU, będzie zajmowało mniej pamięci i będzie bardziej wydajne.

Konfigurowanie zestawu rozwojowego oprogramowania (SDK) języka C

Aby utworzyć aplikację z migającą diodą za pomocą zestawu rozwojowego oprogramowania (SDK) języka C, do dyspozycji jest kilka opcji. Pierwszą z nich jest przejrzenie dokumentacji zestawu rozwojowego oprogramowania (SDK) i postępowanie zgodnie z instrukcjami. Drugą jest użycie gotowego kontenera Dockera, aby automatycznie zainstalować wszystkie narzędzia niezbędne do rozpoczęcia pracy. Trzecią opcją jest ręczna instalacja łańcuchów narzędzi i przykładowego kodu Raspberry Pi Pico, w tym:

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

Pobranie przykładowego kodu Raspberry Pi Pico można wykonać poprzez sklonowanie repozytorium git Raspberry Pi za pomocą następującego polecenia:

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

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

git submodule update --init &&

Po zainstalowaniu tych bibliotek i kodu źródłowego następnym krokiem jest zbadanie i skompilowanie aplikacji migającej diody LED.

Pisanie pierwszej migającej aplikacji

Do zestawu rozwojowego oprogramowania (SDK) języka C dołączono przykład migającej aplikacji, którego deweloperzy mogą użyć do skompilowania swojej pierwszej aplikacji. Poniższy kod wykorzystuje wbudowaną diodę LED płytki Pico i dyrektywę PICO_DEFAULT_LED_PIN, aby skonfigurować wtyk wejścia-wyjścia i błyskać diodą z opóźnieniem 250 milisekund (ms).

Kopiuj
	/**
	 * 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
	}

Listing kodu: płytka Raspberry Pi Pico wykorzystuje dyrektywę PICO_DEFAULT_LED_PIN, aby ustawić wtyk wejścia-wyjścia i błyskać diodą z opóźnieniem 250ms. (Źródło kodu: Raspberry Pi)

Zgodnie z listingiem do LED_PIN przypisano domyślny wtyk. Wywołania są następnie wykonywane do interfejsów API C wejścia-wyjścia ogólnego przeznaczenia. gpio_init służy do inicjalizacji wtyku, a gpio_set_dir służy do ustawienia LED_PIN jako wyjścia. Następnie tworzona jest nieskończona pętla, która przełącza stan diody LED co 250ms.

Skompilowanie aplikacji jest stosunkowo proste. Najpierw deweloper musi utworzyć katalog kompilacji w swoim folderze Raspberry Pi Pico za pomocą następujących poleceń:

mkdir build

cd build

Następnie należy przygotować cmake do kompilacji, wykonując następujące polecenie:

cmake

Teraz programista może przejść do katalogu blink i uruchomić polecenie make:

cd blink

make

Wynikiem procesu kompilacji będzie plik blinky.uf2. Skompilowany program można załadować do Raspberry Pi Pico, przytrzymując wtyk BOOTSEL i włączając zasilanie płytki. RP2 pojawi się wtedy jako urządzenie pamięci masowej. Deweloper musi przeciągnąć plik blinky.uf2 na dysk, po czym program ładujący zainstaluje aplikację. Po zakończeniu dioda LED powinna zacząć migać.

Podsumowanie

Raspberry Pi Pico to atrakcyjne rozwiązanie dla deweloperów systemów wbudowanych poszukujących elastyczności w cyklu rozwojowym. Dostępnych jest kilka opcji, w tym autonomiczne rozwiązania lub płytki z łącznością bezprzewodową. Ponadto ekosystem obsługuje język C i C++, a także MicroPython. Deweloperzy mogą wybrać, który język najlepiej pasuje do ich aplikacji, a następnie wykorzystać odpowiedni zestaw rozwojowy oprogramowania (SDK), aby przyspieszyć tworzenie oprogramowania.

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.

Informacje o autorze

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.

Informacje o wydawcy

Północnoamerykańscy redaktorzy DigiKey