Raspberry Pi Pico

Raspberry Pi Pico

Am 21.01.2021 wurde der Raspberry Pi Pico von der Raspberry Pi Foundation vorgestellt, ein Mikrocontrollerboard im Arduino-Nano-Format, dessen Herzstück der RP2040-Mikrocontroller mit zwei ARM Cortex-M0+ Kernen ist und bis zu 133 MHz getaktet werden kann. Dieser kann in MicroPython oder C/C++ programmiert werden.

Spezifikationen

Mikrocontroller: RP2040 (32-Bit) mit zwei ARM Cortex-M0+ Kernen
Taktfrequenz: bis zu 133 MHz (variabel/übertaktbar)
Speicher: 256kB on-chip SRAM; 2MB on-board QSPI Flash
USB: On-board USB v1.1 (als device oder host)
Stromversorgung: USB (5V) oder ~1,8V bis 5,5V (z.B. Lithium-Ionen-Zelle mit 3,7V oder 2-3 AA-Batterien in Reihe)
Anschlüsse: 26 GPIO-Pins (inkl. 3 analogen Eingängen) bei 3,3V
ADC: 12-bit 500ksps
Schnittstellen: 2× UART
2× I2C
2× SPI
16× PWM-Kanäle
1× Timer mit 4 Alarmen
1× Real time counter
Betriebstemperatur: -20°C bis 85°C (empfohlen sind max. 70°C)
Sonstiges:
  • Eingebauter Temperaturfühler für den MCU
  • Integrierte Fließkomma-Libraries
  • Verschiedene Low-Power/Deep-Sleep-Modi
  • Drag-and-drop-Programmierung über USB möglich
  • 8 programmierbare I/O-(PIO-)Zustandsmaschinen

Durch das Arduino-Nano-Format passt das Board gut auf Breadboards zum einfachen Schaltungsaufbau.
Detailliertere Spezifikationen können aus dem offiziellen Datenblatt für den Raspberry Pi Pico entnommen werden.

Anschlüsse

Anschlüsse/Pinout des Raspberry Pi Pico
Abb.: Anschlüsse des Raspberry Pi Pico (Quelle: raspberrypi.org)
GPIO (General Purpose IO) GP0 - GP22: rein digitale Eingabe/Ausgabe-Pins
GP26 - GP28: digitale oder analoge (ADC) Eingabe/Ausgabe-Pins
GND Ground/Masse-Anschlüsse
#40 (VBUS) VBUS entspricht der Eingangsspannung des Mikro-USB-Eingangs. Dies sind entweder 5V oder 0V, falls der USB-Eingang nicht angeschlossen ist.
#39 (VSYS) VSYS ist die Eingangsspannung des Boards und kann zwischen 1,8V und 5,5V liegen.
#37 (3V3_EN) 3V3_EN ist mit dem SMPS des Boards verbunden und besitzt einen internen Pullup-Widerstand von 100kΩ zu VSYS. Um die 3,3V zu deaktivieren, muss dieser Pin auf LOW geschaltet werden (dies hat auch zur Folge, dass der RP2040 ausgeschaltet wird).
#36 (3V3) 3V3 entspricht einer Spannung von 3,3V, die sowohl intern verwendet wird, als auch für externe Schaltungen verwendet werden kann. Es sollte aber darauf geachtet werden, dass nicht mehr als 300mA fließen.
#35 (ADC_VREF) ADC_VREF entspricht der Betriebs- bzw. Referenzspannung für den ADC. Über eine externe Spannungsquelle an diesem Pin kann die Genauigkeit des ADC verbessert werden.
#33 (AGND) AGND ist die Ground-Referenz für GPIO 26-29. Wenn der ADC nicht verwendet wird oder dessen Leistung unkritisch ist, dann kann dieser Pin auch mit dem digitalen GND verbunden werden.
#30 (RUN) RUN ist der Enable-Pin für den RP2040 und ist mit einem 50kΩ-Pullup-Widerstand mit 3,3V verbunden. Um den RP2040 zu resetten, muss der Pin auf LOW (GND) geschaltet werden.

Verwendete Bauteile

Anschließen des Raspberry Pi Pico am PC

Um den Raspberry Pi Pico im Programmierungs-Modus an den PC (hier: Microsoft Windows) anzuschließen, benötigt man ein Micro-USB-Kabel, welches zunächst in das Board gesteckt wird. Dann hält man den Knopf BOOTSEL auf dem Board gedrückt und schließt das USB-Kabel am PC an. Nun sollte nach kurzer Zeit ein neues USB-Laufwerk RPI-RP2 im Dateimanager auftauchen. Falls dies nicht geschieht, sollte man überprüfen, ob das verwendete USB-Kabel auch Datenleitungen hat und nicht nur ein simples Ladekabel ist.

Programmierung in MicroPython

MicroPython ist eine Implementierung der Programmiersprache Python 3 für Embedded Hardware, wie den Raspberry Pi Pico. Dabei steht eine interaktive Konsole (sog. REPL) zur Verfügung, um Befehle via USB auszuführen, aber auch ein eingebautes Dateisystem. Der Port von MicroPython für den Raspberry Pi Pico stellt zusätzlich Module zur Verfügung, die Zugriff auf die unteren Ebenen der Hardware des Pico ermöglichen.
(Detaillierte Informationen: micropython/wiki bzw. micropython.org)

Vorbereitungen

Zur Programmierung wird von der Raspberry Foundation die Entwicklungsumgebung "Thonny" empfohlen. Diese kann unter thonny.org für die gängigen Betriebssysteme kostenlos heruntergeladen werden. Ich habe für Microsoft Windows die portable-Version verwendet, da hierbei keine Installation notwendig ist. Man startet einfach die thonny.exe und kann sofort loslegen.

Im Menüpunkt "Run" → "Select interpreter..." wird dann noch MicroPython (Raspberry Pi Pico) ausgewählt und man muss den Anweisungen folgen, damit die Firmware richtig installiert werden kann:

Firmware für MicroPython in Thonny installieren

Nach wenigen Sekunden ist die Firmware installiert und man kann direkt beginnen, den Pico zu programmieren.
(Aktuelle Firmware auch verfügbar unter Firmware for Raspberry Pi Pico)

Shell (REPL)

Es können nun direkt Python-Befehle in die Shell eingegeben werden, die sofort vom Pico interpretiert werden, z.B. eine simple Ausgabe:

Python-Shell in Thonny

Sketch I: Interne LED blinken lassen

Das folgende Programm lässt die interne LED (als SMD-Bauteil direkt auf dem Board verbaut) des Raspberry Pi Pico mit der Frequenz von 1 Hz blinken. Die LED besitzt im Gegensatz zum Arduino keinen physischen Pin, kann aber intern genauso angesprochen werden.

Sobald der Code fertig geschrieben ist, kann man ihn (entweder auf dem PC oder direkt auf dem Pico) speichern und dann mit F5 oder dem kleinen Play-Button auf der Menüleiste ausführen lassen.

import machine
import utime

led = machine.Pin(25, machine.Pin.OUT)

while True:
    led.toggle()
    utime.sleep(0.5)

Sketch II: Auslesen der Temperatur

Datenblatt besitzt der RP2040 einen eingebauten Temperatursensor, der sich relativ leicht auslesen lässt. In Kapitel 4.9.4. Temperature Sensor wird die Formel beschrieben, wie man aus den ausgelesenen Daten eine Temperatur erhält. Diese wird durch den folgenden Sketch einmal pro Sekunde ausgegeben:

from machine import Pin
from utime import sleep

sensor = machine.ADC(4)

while True:
    val = sensor.read_u16() * 3.3 / (65535)
    temp = 27 - (val - 0.706)/0.001721
    print (str(round(temp, 2)) + " °C")
    sleep(1)

Weitere Informationen über MicroPython gibt es hier:
Getting started with MicroPython

Sketch III: Externe LED blinken lassen

Für dieses Experiment wird eine LED (z.B. 5mm) mit einem Vorwiderstand (R1 = 330Ω) am Pin GP15 des Pico angeschlossen, wie folgender Schaltplan zeigt:

Schaltplan
Abb.: Schaltplan für den Aufbau mit einer LED und einem Taster. (Derselbe Aufbau wird auch in Sketch IV verwendet)

Als Sketch könnten wir denselben verwenden, wie in Sketch I gezeigt, wobei nur der Pin für die LED auf 15 angepasst werden müsste, jedoch benutzen wir dieses Mal eine andere Art der Zeitgebung für den Blink-Takt: einen sogenannten Timer.

from machine import Pin, Timer
led = Pin(15, Pin.OUT)
timer = Timer()

def blinkLed(timer):
    led.toggle()

timer.init(freq=5, mode=Timer.PERIODIC, callback=blinkLed)

Hier wird ein periodischer Timer mit einer Frequenz von 5 Hz gestartet, welcher bei jedem Takt die Callback-Funktion blinkLed aufruft, die letztendlich die LED zum Blinken bringt, d.h. in jedem Durchgang entweder zum Leuchten oder Erlöschen bringt.

Sketch IV: Button einlesen

Der folgende Sketch prüft auf den Zustand am Eingang eines angeschlossenen Tasters und reagiert mit dem An- bzw. Ausschalten der LED an Pin GP15. Wichtig ist, dass darauf zu achten, dass der Taster mit dem internen Pulldown-Widerstand in der Deklaration verbunden wird, da er ja mit 3V3 angeschlossen ist. Es ist jedoch auch möglich, den Taster stattdessen mit GND zu verbinden, allerdings muss dann ein Pullup-Widerstand in der Deklaration verwendet werden.

from machine import Pin
import time

led = Pin(15, Pin.OUT)
button = Pin(14, Pin.IN, Pin.PULL_DOWN)

while True:
    if button.value():
        led.toggle()
        time.sleep(0.5)

Sketch V: Potentiometer dimmt LED

Mit diesem Versuch werden zwei Funktionen ausprobiert: Das Einlesen analoger Daten mittels eines Potentiometers und das Dimmen einer LED mittels PWM. Dafür verwenden wir folgenden Aufbau:

Schaltplan
Abb.: Schaltplan, um ein Potentiometer und eine LED mit dem Raspberry Pi Pico zu verbinden.

Da der Raspberry Pi Pico im Gegensatz zum Arduino einen höher auflösenden ADC besitzt, so können Werte zwischen 0 und 65535 erreicht werden. Diese kann man dann mit read_u16() vom vorbereiteten Pin auslesen.
Mit PWM(Pin(15)) definiert man den Pin GP15 als PWM-Ausgang und legt mit freq(1000) eine Frequenz von 1000 Hz fest, wie oft an diesem Ausgang das Signal zwischen HIGH und LOW wechseln soll. Mit duty_u16() wird festgelegt, zu wieviel Prozent der Zeit das PWM-Signal pulsen soll, z.B. würden 100% (duty=65025) die LED permanent leuchten und 0% (duty=0) die LED vollständig erlöschen lassen. Alle Werte dazwischen ergeben durch die hohe Schaltgeschwindigkeit den bekannten Dimm-Effekt der LED.

from machine import Pin, PWM, ADC

led = PWM(Pin(15))
led.freq(1000)

potentiometer = ADC(Pin(26))

while True:
	duty = potentiometer.read_u16()
	led.duty_u16(duty)

Eigenständiger Betrieb des Raspberry Pi Pico

Will man den Pico betreiben, ohne dass er am PC angeschlossen ist (z.B. über eine Powerbank), dann muss man noch ein paar Dinge beachten:

Programmierung in CircuitPython

Eine Variante für die Programmierung mit Python ist das von Adafruit entwickelte CircuitPython. Wer schon mit dieser Sprache/Plattform Erfahrung hat, für den empfiehlt sich, in dieser Richtung weiterzulesen: Getting Started with Raspberry Pi Pico and CircuitPython

Programmierung in C++

Mit dem offiziellen Raspberry Pi Pico C/C++ SDK lassen sich Programme in C++ schreiben und dann auf dem Pico ausführen. Diese Möglichkeit habe ich bisher nicht ausprobiert. Weitere Informationen: Getting started with C/C++

Programmierung in C++ mit der Arduino-IDE

Es ist auch möglich, den Raspberry Pi Pico innerhalb der Arduino-IDE zu programmieren. Dafür wurde ein inoffizieller Port für den RP2040 in das Arduino-Ökosystem zur Verfügung gestellt und kann unter https://github.com/earlephilhower/arduino-pico heruntergeladen werden. Um den Raspberry Pi Pico nun in der Arduino-IDE zu laufen zu bringen, sind folgende Schritte notwendig:

Vorbereitungen

Sketche kompilieren/hochladen

Um das erste Mal einen Sketch hochzuladen, drückt man BOOTSEL während man das Board per USB-Kabel an den PC anschließt. Nun kann man den Sketch wie üblich in der Arduino-IDE auf das Board laden.
Nach diesem ersten Upload kann man im Menü "Werkzeuge" → "Port" den erkannten Port auswählen und es sollte jedes weitere Upload ohne Probleme funktionieren. Dies hat bei mir nicht funktioniert und so musste ich für jeden Upload die Prozedur mit dem Drücken von BOOTSEL wiederholen.

Sketch I.: Interne LED blinken lassen

Analog zum ersten Sketch, den wohl jeder Arduino-Einsteiger ausprobiert, wird hier die interne LED mit der Frequenz von 1 Hz zum Blinken gebracht. Diese LED besitzt im Gegensatz zum Arduino keinen physischen Pin, kann aber intern genauso angesprochen werden, wie der folgende Sketch zeigt:

#define INT_LED_PIN 25

void setup()
{
    pinMode(INT_LED_PIN, OUTPUT);
}

void loop()
{
    digitalWrite(INT_LED_PIN, HIGH);
    delay(500);
    digitalWrite(INT_LED_PIN, LOW);
    delay(500);
}

Hinweis: Da der Raspberry Pi Pico noch ziemlich neu auf dem Markt ist, ist dieser Port noch nicht fertig entwickelt und unterliegt häufigen Änderungen. Außerdem ist noch keine 100%ige Kompatibilität erreicht, d.h. nicht alle Funktionen sind verfügbar. Man sollte sich also regelmäßig über Updates und Bugfixes informieren.

zurück