Kennismaking met het Raspberry Pi Pico-board en de RP2040
Weer een Raspberry Pi?
Ja, maar nu is het een nieuw Raspberry Pi-product – de Raspberry Pi Pico (figuur 1).
We zeggen het op voorhand, de Raspberry Pi Pico is niet bedoeld om een bestaande Raspberry Pi te vervangen. Hij is bedoeld als een uitbreiding op en een metgezel voor de bestaande Raspberry Pi-familie. Hoewel het een Raspberry Pi is, is hij totaal anders dan wat we tot nu toe hebben gezien. De Raspberry Pi Pico is een op een dual-core ARM gebaseerd board dat alleen de minimale schakelingen aan boord heeft om het te laten werken. Ook al klinkt het als een aangepaste Pi Zero, dat is het niet. De Raspberry Pi Pico gebruikt geen Broadcom-CPU zoals de andere Raspberry Pi-boards die we kennen. Deze gebruikt een chip, de RP2040, die in eigen beheer is ontworpen door de Raspberry Pi Foundation zelf.
De RP2040 is een dual-core ARM Cortex-M0+ microcontroller. Deze core is geen voor Linux geschikte SoC zoals we eerder hebben gezien. De Raspberry Pi Pico betreedt het gebied van de microcontrollers, waar Arduino’s, STM32 BluePill-boards en op ESP32 gebaseerde boards tegenwoordig het meest gebruikt worden, terwijl op RISC-V gebaseerde SBC’s (zoals de GD32VF103) steeds populairder worden. Hij is betaalbaar, met een prijskaartje van rond de € 5, wat hem in de categorie brengt van een gekloonde Arduino Nano en de STM32 BluePill. En hij kost minder dan een ESP32 Pico-kit.
In dit artikel bekijken we de specificaties en kenmerken van de Raspberry Pi Pico en zijn RP2040. Bekijk zeker ook de unboxing-video van Clemens Valens op het YouTube-kanaal van Elektor [1] en dit handige overzicht [2].
Een eerste blik op de Raspberry Pi Pico
Zoals we al hebben vermeld, is de Raspberry Pi Pico uitgerust met een dual-core Cortex-M0+ microcontroller met een kloksnelheid van 133 MHz. Hoewel dual-core Cortex-M MCU’s tegenwoordig niet ongewoon zijn, hebben ze meestal geen twee Cortex-M0+ kernen, maar gebruiken ze de krachtigere Cortex-M4, Cortex-M7, of de nieuwere Cortex-M33 kernen.
De RP2040-MCU die in de Raspberry Pi Pico wordt gebruikt, volgt het in figuur 2 getoonde naamschema.
We kunnen alleen maar raden naar welke andere versies zullen volgen, aangezien dit suggereert dat er mogelijk meer varianten komen. We hebben de Raspberry Pi Foundation gevraagd of er meer varianten zullen volgen, maar we hebben nog geen antwoord gekregen. De specificaties van deze MCU staan in tabel 1.
Een overzicht van de periferie en functieblokken in de RP2040 is te zien in figuur 3.
Een van de unieke dingen die in eerste instantie over het hoofd kan worden gezien, is de afwezigheid van flash-geheugen in de MCU. Op de Raspberry Pi Pico bevindt zich naast de MCU een klein IC – een W25Q16JUXIQ NOR-flash met plaats voor 2 MB. De RP2040 ondersteunt tot 16 MB extern geheugen, dus het vergroten van het geheugen is een kwestie van het vervangen van de flash-chip. De Raspberry Pi Pico heeft een USB-poort die kan worden geconfigureerd als host of slave in USB 1.1-modus (12 Mbit/s), dus om USB-periferie aan te sluiten of om zelf als USB-apparaat te fungeren.
De RP2040 bevat een boot-ROM, waar de gebruiker nieuwe code naar kan uploaden vanaf een computer. Om speciale programmeertools te vermijden, meldt de geïntegreerde bootloader zich als apparaat voor massaopslag en kan de RP2040 worden geprogrammeerd door simpelweg nieuwe firmwarebestanden naar het apparaat te kopiëren (figuur 4), een eenvoudige en handige manier om apparaten te programmeren.
Ook de voeding is gebruiksvriendelijk. U kunt het apparaat van 5 V voorzien via micro-USB. Het accepteert ook spanningen van 1,8 V tot 5,5 V via een DC/DC buck-boost converter op de VSYS-pin. Dit maakt ook het gebruik van een oplaadbare lithium-batterij of gewoon een set van twee of drie NiMH-batterijen mogelijk. Overgenomen uit de datasheet [3] toont figuur 5 de verschillende voedingsmogelijkheden.
Het DC/DC buck-boost IC is hier een RT6150, waarvan de datasheet te vinden is op [4]; dit IC heeft genoeg aan slechts een paar componenten om te werken, zoals te zien in het schema van figuur 6.
De 40 pinnen van de Rasberry Pi Pico zitten aan de lange zijkanten van het board, waardoor 26 GPIO’s inclusief drie ADC-inputs van de RP2040-IO’s toegankelijk zijn. De andere pinnen zijn voor voeding en massa. De maximale IO-spanning voor de Raspberry Pi Pico is 3,3 V op alle GPIO-pinnen. Aan de onderzijde van de print (figuur 7) is elke pin gelabeld.
Er zijn drie extra pinnen op het Pico-board (SWCLK, SWIO en GND) voor de Serial Wire Debug-poort, waarmee de RP2040 kan worden geprogrammeerd en ook gedebugd.
Periferie en het Programmable Input/Output-blok
De Raspberry Pi Pico met zijn RP2040 omvat, zoals te verwachten, een verzameling van de meestgebruikte periferie: twee UART’s, twee I2C-controllers, twee SPI-controllers, 16 PWM-kanalen, een 12-bit ADC met 500 kSps, een geïntegreerde temperatuursensor, een real-time klok, een timer en de basis-GPIO-functies. Ook inbegrepen en minder gebruikelijk is de USB-interface, werkend als host en slave, en acht Programmable IO (PIO) toestandsmachines.
Deze laatste kunnen worden gebruikt om diverse interfaces te implementeren, zoals (extra) UART, I2C, I2S en SPI, maar ook SD-Card, VGA, DPI en nog veel meer. De datasheet van de RP2040 bevat een speciale sectie met uitleg over het gebruik, plus voorbeeldprogramma’s. Figuur 8 toont een blok met vier toestandsmachines.
Deze kunnen een set van negen commando’s uitvoeren: JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, en SET. Omdat deze toestandsmachines onafhankelijk van de beide CPU-kernen kunnen werken, kunnen interfaces worden gevormd die niet door de onboard-hardware wordt ondersteund, waarbij de CPU-kernen ontlast worden.
De native UART’s in de RP2040 zijn gebaseerd op de ARM Primecell UART (PL011), die ook wordt gebruikt op andere Raspberry Pi-boards, waardoor een maximale snelheid tot 961,6 kBaud mogelijk is. Voor de twee SPI-interfaces wordt een ARM Primecell SPI (PL022) gebruikt, die ook in andere Raspberry Pi’s is ingebouwd. Deze interface kan data overdragen tot F_CPU/2 SPI klok in master-modus. De aanwezige I2C-controller ondersteunt standaardmodus (100 kHz), fast-modus (400 kHz) en fast-modus plus (1 MHz) kloksnelheden met 7- en 10-bit adressering als master of slave. Deze drie interfaces bieden connectiviteit met de meeste gebruikte externe hardware en vormen een goede balans tussen functies en complexiteit van de apparaten.
De ADC in de RP2040 is een basis-SAR met 500 kSps bij een 12-bit resolutie. Hij heeft vier inputs en een temperatuursensor. Als u gewend bent aan de ADC’s van bijvoorbeeld een AVR, treft u normaal gesproken een bandgap-referentie aan die 2,56 V of 1,1 V aan de ADC levert als referentiespanning; hier wordt de ADC_AVDD-pin op de RP2040 gebruikt. Op het Raspberry Pi Pico board betekent dit dat een externe spanning als referentie vereist is. De implementatie op de Raspberry Pi Pico is te zien in figuur 9, waar deze pin via een weerstand met 3,3 V en een filternetwerkje is verbonden.
Een andere interessante eigenschap is de USB-interface die op de RP2040 en dus ook op de Raspberry Pi Pico aanwezig is. De Pico kan worden geconfigureerd als host of slave en biedt een overdrachtssnelheid tot 12 Mbit/s in USB1.1-modus. Dit maakt het gebruik van USB-apparaten zoals muis en toetsenbord en USB-connectiviteit met een PC of Raspberry Pi mogelijk. Voor de USB host-modus ondersteunt de controller het gebruik van USB-hubs, zodat u zich niet tot het aansluiten van slechts één apparaat hoeft te beperken.
De RP2040 heeft één dedicated 64-bit timer die werkt met een tijdbasis van 1 µs. Hiermee kunnen tot vier alarmtimersworden ingesteld, of kunnen vertragingen in het µs-bereik worden gegenereerd. Voor het herhalen van getimede gebeurtenissen of interrupts kunt u een van de acht 16-bit PWM-units gebruiken, elk met twee kanalen. Figuur 10 toont het blok dat in één PWM-unit is opgenomen.
De GPIO-pinnen voor PWM zijn ook te gebruiken voor frequentie- en duty cycle-metingen, voor het genereren van interrupts, DMA-requests en ze hebben een fractionele klokdeler voor een nauwkeurigere frequentie-aanpassing.
Voor meer geavanceerde programmering bevat de RP2040 een DMA-eenheid die gegevensoverdracht in het systeem mogelijk maakt zonder tussenkomst van de CPU-kernen. Zo is het mogelijk AD-omzettingen uit te voeren en de resultaten naar een voorgedefinieerde buffer in het geheugen te verplaatsen zonder tussenkomst van de CPU, of gegevens uit het geheugen naar een UART te sturen. Ook het kopiëren van grote aantallen buffers binnen de RP2040 van de ene plaats naar de andere kan zonder de CPU’s en gaat zelfs sneller dan met de CPU’s. Dit komt ook van pas als u gegevens naar een extern aangesloten display moet verplaatsen. Aangezien de DMA-unit ook kan worden gekoppeld aan de Programmable IO (PIO) toestandsmachines, vormt dit een krachtige manier voor snelle gegevensuitwisseling met externe apparaten.
The Raspberry Pi Pico with its RP2040 includes a set of the most common peripherals you would expect to find: two UARTs, two I²C-Controllers, two SPI controllers, 16 PWM channels, a 12-bit ADC with 500 ksps, an integrated temperature sensor, a real-time clock, timer and the basic GPIO functions. Also included and less common is the USB interface, working as host and slave, and eight Programmable IO (PIO) state machines.
Schema’s, handleidingen en ontwerpbestanden
Het Raspberry Pi Pico-board is het eerste RP2040-board. Figuur 9 toont het schema. De MCU is omringd door de DC/DC-converter, extern QSPI NOR flash-geheugen en wat schakelingen om de voedingsspanning te meten en de DC/DC-converter in de low-power modus te zetten, en een USB-interface.
De Raspberry Pi Foundation levert ook KiCad- en Fritzing-bestanden om aan de slag te gaan met uw eigen ontwerpen. Het is interessant om te zien dat u een referentie-ontwerp krijgt dat niet van de Raspberry Pi Pico is, maar een demonstratie van hoe u uw eigen board met de RP2040 kunt maken. Als u hardware ontwerpt, weet dat bij de meeste andere microcontrollers geen speciale aandacht aan de pinout is besteed. Maar met de RP2040 zullen PCB-ontwerpers de Raspberry Pi Foundation dankbaar zijn voor het in groepen combineren van bij elkaar horende pinnen, die gemakkelijk te routeren zijn naar externe hardware. Figuur 11 toont de pinout; u kunt duidelijk zien dat er ook aan het hardware-ontwerp is gedacht.
Op het moment van schrijven zijn zowel de handleidingen als de software nog niet definitief, dus er kunnen nog kleine wijzigingen of toevoegingen komen. Nietemin ziet u duidelijk dat dit een Raspberry Pi-product is met documentatie die van meet af aan klaar en volledig is en dat het open hardware is. Daarnaast betekent dit ook dat er van meet af aan een open SDK wordt geleverd die applicatieontwikkeling op uw Raspberry Pi, uw Linux- of Windows-PC of een Intel-gebaseerde Mac mogelijk maakt. Op dit moment kunt u voor het ontwikkelen van uw eigen applicaties kiezen tussen MicroPython en C/C++.
Programmeren met MicroPython
Veel RP2040-programmeurs zullen de voorkeur geven aan C/C++ (of in de nabije toekomst aan de Arduino IDE, want ondersteuning is al aangekondigd). MicroPython is echter ook een optie als u deze microcontroller wilt programmeren. Allereerst hebt u een Raspberry Pi 4 nodig met Raspberry Pi OS of – volgens de handleiding – een gelijkwaardige op Debian gebaseerde Linux-distributie die op een ander platform draait. U kunt uw eigen Raspberry Pi Pico MicroPython-port builden volgens de instructies in de handleiding [5] of een kant-en-klare binary downloaden via de Pico getting started pagina’s [6].
Door het board aan te sluiten op de Raspberry Pi 4 met een micro-USB kabel terwijl de BOOTSEL-knop ingedrukt wordt gehouden, wordt het Pico-board aangemeld als USB-apparaat voor massaopslag. U kunt het binaire bestand dan naar het board slepen om het in het flash-geheugen te zetten. Na deze installatie kunt u verbinding maken met de Raspberry Pi Pico in de MicroPython Interactive Interpreter Mode (ook REPL genoemd) via USB of de UART van de Pico.
Daarnaast werkt de MicroPython-port naar de Raspberry Pi Pico en andere op de RP2040 gebaseerde boards met veelgebruikte Integrated Development Environments (IDE’s) zoals Thonny (figuur 12). De handleiding bevat instructies voor het installeren en configureren van deze IDE voor het programmeren van de Pi Pico in MicroPython.
Bent u geïnteresseerd in MicroPython? In het boek Get Started with MicroPython on Raspberry Pi Pico (G. Halfacree en B. Everard, Raspberry Pi Foundation 2021) leert u hoe u MicroPython kunt gebruiken om programma’s te schrijven en hardware aan te sluiten om uw Raspberry Pi Pico te laten samenwerken met de wereld om hem heen. (Zie het kader Gerelateerde producten).
C/C++ ontwikkeling op een Pi met een Pi
Uit de uitgebrachte beschrijving en tools blijkt dat programmeren met C/C++ bedoeld is voor op een Raspberry Pi 4. Het opzetten van een ontwikkelomgeving op andere systemen staat beschreven in de handleiding [7], maar voor de Raspberry Pi kunt u een handig script downloaden [8] dat alle stappen voor zijn rekening neemt die nodig zijn voor de installatie. De verbinding tussen de Raspberry Pi 4 en de Raspberry Pi Pico gaat volgens figuur 13. In deze opstelling zal de Raspberry Pi 4 ook fungeren als debug-interface met een gepatchte versie van OpenOCD. Als u graag een PC of Mac gebruikt, kunt u een debug-probe bouwen met een tweede Raspberry Pi Pico zoals beschreven in de handleiding.
Als u liever een IDE gebruikt dan alleen programmeren in een shell, kunt u Visual Studio Code (figuur 14) installeren via het bijgeleverde script, dan hebt u een IDE om mee te beginnen. Op het moment van schrijven konden de voorbeelden behoorlijk goed worden gevolgd, maar de projectgenerator om nieuwe projecten te starten zonder van alles handmatig op een commandoregel te moeten doen was nog niet helemaal klaar. Zelfs als u bij de lancering wat kleine problemen zou kunnen ervaren, zoals we hebben gezien bij de Raspberry Pi 4, zullen er na verloop van tijd zeker verbeteringen komen naarmate meer gebruikers de meegeleverde software gaan gebruiken en bugs melden.
Voor de RP2040 staat een uitgebreide set bibliotheken en voorbeelden klaar om u op weg te helpen met de chip. U hoeft dus niet zelf drivers te schrijven voor elk onderdeel van de chip. Ook is voor de USB de TinyUSB-bibliotheek opgenomen die is uitgebreid om de RP2040 te ondersteunen, zodat u snel kunt instappen. Het mooie is dat u, omdat alle code open is, in de bestanden kunt duiken en kunt bestuderen hoe alles in elkaar zit. Als u meer gewend bent aan een framework dat compatibel is met Arduino Wiring: dit is op het moment van schrijven nog niet uitgebracht, maar net als voor andere niet-Arduino platforms die interessant zijn, zal dat slecht een kwestie van tijd zijn.
Als u een PC of Mac gebruikt en wilt beginnen met programmeren, kun u het beste een virtuele machine gebruiken om de ontwikkelomgeving op te zetten. Als u dan op sommige punten problemen ondervindt, kunt u terugschakelen naar een opgeslagen snapshot om in korte tijd weer een goed werkend systeem te hebben.
Nog wat gedachten over de Pico
Hebt u microcontrollers links laten liggen omdat ze te duur lijken of minder goed gedocumenteerd? Nu hebt u daarvoor geen excuus meer. Koop een paar Raspberry Pi Pico’s nu ze nog goed verkrijgbaar zijn en begin met programmeren. Voor een prijs van € 5 per stuk en met alle ondersteuning en documentatie van de Raspberry Pi Foundation is het niet de vraag of u er een moet kopen, maar veeleer hoeveel Pico-boards u moet kopen. Dankzij de beschikbaarheid van datasheets, programmeertools, voorbeelden en laagdrempelige handleidingen is het werken met een Pico heel plezierig. Hij is niet voorbehouden aan ervaren ontwikkelaars; hij kan worden gebruikt om kinderen en studenten te onderwijzen. Als u nieuwe projecten start met het board, laat het ons dan weten en deel uw ervaringen. We zijn benieuwd waar u mee op de proppen komt.
(210045-03)
Raspberry Pi Pico: specificaties
- CPU type: Cortex M0+
- Aantal kernen: 2
- Max. snelheid: 133 MHz
- SRAM: 264 kB in 6 banken
- Flash intern: 0 kB
- Flash extern: 2 MB QSPI flash (tot 16 MB ondersteund)
- GPIO’s: 26 (incl. 4 ADC)
- USB: 1.1 Host / Slave
- ADC: 12-bit @ 500 kSps
- ADC-kanalen: 5 (incl. temperatuursensor)
- SPI: 2
- UART: 2
- I2C: 2
- PWM: 16 kanalen
- Timer: 1x 64-bit
- RTC: Ja
- Unieke eigenschappen: programmeerbare IO-state-machine, boot ROM met USB-massaopslag bootloader
Mist u de paragraaf over laag vermogen in dit artikel?
Deze vraag leidde tot wat discussie onder de redacteuren die al met de Raspberry Pi Pico aan het spelen waren. Normaal gesproken is een van de eerste dingen die men merktbij een nieuwe MCU het lage stroomverbruik, en dat is meestal maar een paar honderd nA of een paar µA die nodig is voor de slaap-modus. Als u de datasheet van de RP2040 bekijkt, dan ziet u een gemiddeld stroomverbruik van 0,18 mA in deep sleep. Dat klinkt misschien niet zo slecht, en 180 µA is een waarde waar u mee kunt leven; maar voor de Raspberry Pi Pico zit er een addertje onder het gras. Op het board zit niet alleen de RP2040, maar ook de externe flash en de DC/DC-converter. Terwijl de flash-chip met 50 µA in standby-mode kan gaan of zelfs kan terugschakelen naar 15 µA, moet de DC/DC-converter bij zeer lage belastingen werken. Deze resultaten uit de datasheet van de Raspberry Pi Pico komen uit op een standby-stroom van 0,8 mA bij 25 °C. Dit is gewoon iets waar u rekening mee moet houden als u van plan bent om het board voor een langere periode op batterijen te laten werken. Dus de paragraaf over laag vermogen is niet vergeten, maar op een gegeven moment moet men een soort compromis hebben wat betreft functionaliteit, stroomvereisten en beoogde toepassing. De perfecte microcontroller bestaat niet, maar de eerste chip van de Raspberry Pi Foundation biedt een veelbelovende vooruitblik op wat we kunnen verwachten. Met betrekking tot de optimalisatie van het stroomverbruik zal in de komende tijd moeten blijken of en hoe het ontwerp kan worden aangepast om er nog een paar µA meer uit te halen voor een langere runtime. Dit geldt ook voor de softwareontwikkeling en hoe u uw code kunt optimaliseren, niet alleen voor snelheid maar ook om energie-efficiënt te werken op apparaten met batterijen.
Web Links
[1] C. Valens, “Raspberry Pi Pico Review,” Elektor.TV, 1/21/2021.
[2] C. Valens, “Now Playing at a Theatre Near You: RP2040 in Raspberry Pi Pico,” ElektorMagazine.com, 1/22/2021.
[3] The Raspberry Pi Pico datasheet
[4] RT6150 datasheet
[5] Pico MicroPython manual
[6] Pico Getting Started
[7] C/C++ setup
[8] IDE setup script
[9] RP2040 datasheet
[10] Pico Getting Started datasheet
Vragen of opmerkingen?
Hebt u vragen of opmerkingen naar aanleiding van dit artikel? Stuur een e-mail naar de auteurs via mathias.claussen@elektor.com.