Klik hier voor de Engelse versie van de broncode.

Aan de slag met het Raspberry Pi Pico Multicore-microcontrollerbord met C

Door Jacob Beningo

Bijgedragen door De Noord-Amerikaanse redacteurs van DigiKey

In ingebedde systemen is er een inherente behoefte aan een krachtige, goedkope microcontroller (MCU). Deze apparaten spelen niet alleen een belangrijke rol in het product, maar ook in de ondersteuning van tests, rapid prototyping en mogelijkheden zoals machine learning (ML). Om aan de slag te gaan met MCU's is over het algemeen echter een grondige kennis nodig van MCU-technologie en programmeertalen op laag niveau. Bovendien kosten ontwikkelingsborden vaak tussen de $20 en $1000, wat voor veel ontwikkelaars te duur kan zijn. Het is ook niet altijd zo dat er een ontwikkelingsbord beschikbaar is, en zelfs als dat wel zo is, hebben ontwerpers vaak moeite om een bord aan de praat te krijgen.

Dit artikel introduceert de Raspberry Pi Pico (SC0915) als een goedkoop ontwikkelingsbord voor de RP2040 MCU dat ontwikkelaars een breed scala aan mogelijkheden biedt. Het artikel verkent de Pico en enkele uitbreidingskaarten, onderzoekt de verschillende software-ontwikkelkits die de Raspberry Pi Pico ondersteunt en demonstreert hoe je een knipperende LED-toepassing maakt met behulp van de C-SDK.

Inleiding op de Raspberry Pi Pico

De Raspberry Pi Pico werd voor het eerst geïntroduceerd in 2021 als het ontwikkelingsplatform voor de RP2040-microcontroller. De Pico kan worden gebruikt als een standalone ontwikkelingsbord, of kan direct in een product worden ontworpen dankzij randverbindingen die aan een draagkaart kunnen worden gesoldeerd (afbeelding 1). De Pico kost minder dan $5 en is multifunctioneel, waardoor het een populaire oplossing is geworden voor zowel makers als professionele ontwikkelaars.

Afbeelding van Raspberry Pi Pico is een goedkoop ontwikkelingsbordAfbeelding 1: De Raspberry Pi Pico is een goedkoop ontwikkelingsbord dat alles bevat wat nodig is om toepassingen te ontwikkelen op de RP2040-microcontroller. (Bron afbeelding: Raspberry Pi)

De RP2040 heeft een dual-core Arm® Cortex®-M0+ processor geklokt op 133 megahertz (MHz) en bevat tot 264 kilobytes (Kbytes) SRAM. De RP2040 bevat geen flash op de chip. In plaats daarvan biedt de Raspberry Pi Pico een externe flashchip van 2 megabyte (Mbyte) die via een quad seriële periferie-interface (QSPI) met de RP2040 communiceert. Het bord heeft ook een gebruikers-LED, een kristaloscillator die de phase lock loop (PLL) gebruikt om een stabiele CPU-klok op hoge snelheid te maken, en een drukknop om te configureren of de processor normaal opstart of in een bootloader.

Een uitgebreid ecosysteem

De Raspberry Pi Pico heeft al een uitgebreid ecosysteem waarmee ontwikkelaars kunnen kiezen tussen het gebruik van MicroPython- of C Software Development Kits om toepassingen voor het bord te schrijven. Een interessante opmerking over de Raspberry Pi Pico is dat er niet slechts één ontwikkelingsbord beschikbaar is. In plaats daarvan zijn er drie: het originele SC0915 met een standaardconfiguratie, het SC0917 met headerconnectors en het SC0918 met een goedkope wifi-chip voor aangesloten toepassingen (afbeelding 2).

Afbeelding van Raspberry Pi Pico is beschikbaar in drie configuratiesAfbeelding 2: De Raspberry Pi Pico is verkrijgbaar in drie configuraties. (Bron afbeelding: Beningo Embedded Group, LLC)

Voor elk van deze versies blijft de algemene voetafdruk van het bord hetzelfde. De randverbindingen voor de printplaat bestaan uit 40-pins randverbindingen voor de randapparatuur en verbindingsopties die worden getoond in afbeelding 3. Deze omvatten voeding, aarde, een universele asynchrone ontvanger en zender (UART), ingang en uitgang voor algemeen gebruik (GPIO), pulsbreedtemodulatie (PWM), een analoog-digitaalomzetter (ADC), een seriële perifere interconnectie (SPI), een intergeïntegreerde circuitinterface (I2C) en foutopsporing.

Afbeelding van Raspberry Pi Pico randverbonden pinbezettingen (klik om te vergroten)Afbeelding 3: De randverbonden pinbezettingen van de Raspberry Pi Pico bieden een grote verscheidenheid aan toegang tot randapparatuur. (Bron afbeelding: Raspberry Pi)

Breakout-boardopties

Wanneer de Raspberry Pi wordt gebruikt voor rapid prototyping, is het nodig om gemakkelijk toegang te krijgen tot de randconnectoren van het bord. Een optie om ze te gebruiken is om de headers in te vullen en een breadboard te gebruiken. Deze oplossing resulteert echter vaak in een warboel van draden die tot fouten kan leiden. In plaats daarvan zijn er dus verschillende opties voor breakout-boards die de randconnectors uitbreiden naar beter beschikbare interfaces.

Het MM2040EV Pico-modulebord van Bridgetek splitst bijvoorbeeld de meeste randconnectors op in pin- en busverbindingen. Daarnaast is er de 103100142-afscherming voor de Pico van Seeed Studio die elke perifere interface voorziet van een connector. Elke connector is pin-compatibel met uitbreidingskaarten om functies toe te voegen zoals traagheidssensoren, motorstuurprogramma's en afstandsmeters.

C of MicroPython?

Ingebedde systemen zijn van oudsher geschreven in C, omdat dit een balans biedt tussen besturing op laag niveau en toepassing van het systeem op hoger niveau. Het probleem met C vandaag de dag is dat het een verouderde, vijftig jaar oude programmeertaal is die zelden wordt onderwezen op universiteiten. Het is ook te gemakkelijk om per ongeluk fouten aan te brengen en schade te veroorzaken. Ondanks deze potentiële problemen is C de voorkeurstaal voor het merendeel van de ontwikkeling van ingebedde systemen.

Een alternatief voor het gebruik van C, geleverd door het Raspberry Pi Pico-ecosysteem, is MicroPython. MicroPython is een CPython-poort die is ontworpen om te draaien op MCU-gebaseerde systemen. Hoewel het ongetwijfeld een zwaardere processorgebruiker is dan C, is het een moderne taal waarmee veel ontwikkelaars vertrouwd en comfortabel zijn. MicroPython kan de low-level details van de MCU en hardware abstraheren. Hardware wordt benaderd via API's (Application Programming Interfaces) op hoog niveau die eenvoudig te leren zijn - een belangrijke eigenschap bij krappe projectdeadlines.

Bij het kiezen van de SDK (Software Development Kit) die ze willen gebruiken - C of Micropython - moeten ontwikkelaars zich richten op specifieke behoeften. Vergeleken met MicroPython biedt het gebruik van C toegang op laag niveau tot de registers van de MCU, heeft het een kleinere geheugenvoetafdruk en is het efficiënter.

De C SDK instellen

Als je de C SDK gebruikt om een knipperende LED-toepassing te maken, zijn er verschillende opties. De eerste is om de SDK-documentatie door te nemen en de instructies te volgen. De tweede is om een vooraf ingestelde Docker-container te gebruiken om automatisch alle tools te installeren die nodig zijn om aan de slag te gaan. Een derde optie is om de toolchains en de Raspberry Pi Pico voorbeeldcode handmatig te installeren, inclusief:

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

Het ophalen van de Raspberry Pi Pico voorbeeldcode kan worden uitgevoerd door Raspberry Pi's git repo te klonen met het volgende commando:

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

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

git submodule update --init &&

Zodra deze bibliotheken en de broncode zijn geïnstalleerd, is de volgende stap het verkennen en compileren van een knipperende LED-toepassing.

Een eerste knipper-toepassing schrijven

De C SDK wordt geleverd met een knipper-voorbeeld dat ontwikkelaars kunnen gebruiken om hun eerste toepassing te bouwen. De onderstaande codelijst gebruikt de ingebouwde LED van de Pico en de PICO_DEFAULT_LED_PIN richtlijn om een I/O pin in te stellen en deze te laten knipperen met een vertraging van 250 milliseconden (ms).

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

Codelijst: de Raspberry Pi Pico gebruikt de PICO_DEFAULT_LED_PIN richtlijn om een I/O pin in te stellen en deze te laten knipperen met een vertraging van 250 ms. (Bron code: Raspberry Pi)

In de lijst wordt de LED_PIN als standaardpin toegewezen; vervolgens worden de C gpio API's aangeroepen. gpio_init wordt gebruikt om de pin te initialiseren, terwijl gpio_set_dir wordt gebruikt om de LED_PIN in te stellen op een uitgang. Er wordt dan een oneindige lus gemaakt die elke 250 ms de toestand van de LED wisselt.

Het compileren van de applicatie is relatief eenvoudig. Eerst moet een ontwikkelaar een bouwmap aanmaken in zijn of haar Raspberry Pi Pico-map met behulp van de volgende commando's:

mkdir build

cd build

Vervolgens moet cmake worden voorbereid op de build door het volgende commando uit te voeren:

cmake

Nu kan een ontwikkelaar naar de knipper-map gaan en make uitvoeren:

cd blink

make

De uitvoer van het bouwproces zal een blinky.uf2 bestand zijn. Het gecompileerde programma kan op de Raspberry Pi Pico worden geladen door de BOOTSEL-pin ingedrukt te houden en het bord aan te zetten. De RP2 wordt dan weergegeven als een apparaat voor massaopslag. De ontwikkelaar moet het bestand blinky.uf2 naar de schijf slepen, waarna de bootloader de toepassing installeert. Wanneer dat is gedaan, moet de LED beginnen te knipperen.

Conclusie

De Raspberry Pi Pico is een aantrekkelijke oplossing voor embedded ontwikkelaars die op zoek zijn naar flexibiliteit in hun ontwikkelingscyclus. Er zijn verschillende opties beschikbaar, waaronder standalone oplossingen of borden met draadloze connectiviteit. Daarnaast ondersteunt het ecosysteem C en C++, net als MicroPython. Ontwikkelaars kunnen kiezen welke taal het beste werkt voor hun toepassing en vervolgens de bijbehorende SDK gebruiken om de softwareontwikkeling te versnellen.

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.

Achtergrondinformatie over deze auteur

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo is een embedded software consultant. Hij heeft meer dan 200 artikelen over embedded software ontwikkelingstechnieken gepubliceerd, is een veelgevraagde spreker en technische trainer en heeft drie universitaire graden, waaronder een Masters of Engineering bij de University of Michigan.

Over deze uitgever

De Noord-Amerikaanse redacteurs van DigiKey