Die Programmbeispiele in dem eBook zu den Sensorkits sind für die Arduino-Familie in Anlehnung an die Programmiersprache C/C++ geschrieben. Mit dieser Blog-Reihe sollen Beispiele in der Sprache MicroPython vorgestellt werden. Dabei werden von der Programmierung ähnliche Sensoren oder Bauelemente gruppiert.
Zu Beginn werden noch einmal die wichtigsten Angaben zum Raspberry Pi Pico bzw. Pico W und zur Programmierumgebung Thonny zusammengefasst, um dann wie traditionell üblich mit dem „Hello World“ des „Physical Computing“ - dem Blinken einer LED - zu beginnen. Genau wie die LEDs werden auch einige andere Bauteile des Kits an GPIOs (General Purpose Input/Output), also Pins als Ausgänge angesteuert, so dass diese ebenfalls im ersten Teil behandelt werden.
Im zweiten Teil werden die GPIOs als Eingänge benutzt, zunächst am Beispiel des Tasters, um die Bedeutung von Pull-up- bzw. Pull-down-Widerständen zu verstehen. Dann werden die Sensoren behandelt, die wie Schalter/Taster funktionieren. Da einige der Sensoren sowohl digitale als auch analoge Ausgänge besitzen, werden auch die anlogen Eingänge mit ihren Besonderheiten thematisiert.
Der dritte Teil widmet sich dann den Sensoren, die eine besondere elektronische Schnittstelle benötigen, One-Wire-Interface, I2C (=Inter Integrated Circuit Interface) und SPI (=Serial Peripheral Interface). Hier werden auch weitere Sensoren aus dem Sortiment von AZ-Delivery behandelt, die nicht Teil des Kits sind.
Benötigte Teile
1 |
Raspberry Pi Pico oder Pico W |
1 |
|
alt |
|
1 |
|
Jumperkabel, Taster/Button |
|
optional |
Zunächst noch einmal das Pinout-Diagramm des Pico W. Dabei ist die Belegung der nach außen geführten Pins identisch mit dem Pico ohne WiFi/Bluetooth, nur die Debug-Pins liegen an anderer Stelle.
Wie auch bei anderen Mikro Controllern sind viele der GPIOs mehrfach belegt mit besonderen Schnittstellen. Wie angekündigt, wollen wir zunächst die eingebaute LED blinken lassen. Dazu benutzen wir als Programmierumgebung für MicroPython das Programm Thonny. Eine ausführliche Erklärung der Installation von Thonny und erste „Gehversuche“ siehe Blog-Reihe „Raspberry Pi Pico und Thonny mit MicroPython“ (Link zu Teil 1, Teil 2, Teil 3).
Anders als beim ATmega328 Uno kann man keine externe LED zur internen LED parallelschalten, der entsprechende Pin ist nicht herausgeführt. Und es gibt einen Unterschied zwischen dem Pico und dem Pico W: Beim Pico wird GPIO25 benutzt, beim Pico W wird diese Leitung für den Infineon Chip für WiFi/Bluetooth verwendet, an dem dann auch die LED angeschlossen wird.
Codebeispiele
Es folgt der Code für den Pico. Man importiert das Modul machine und instanziiert das Objekt led_onboard = machine.Pin(25, machine.Pin.OUT).
Auskommentiert ist die Version für den Pico W, in dem anstelle von Pin 25 der String-Term „LED“ verwendet wird.
import machine
import utime as time
# Codezeile für Raspberry Pi Pico (ohne WLAN)
#led_onboard = machine.Pin(25, machine.Pin.OUT)
# Codezeile für Raspberry Pi Pico W (mit WLAN)
led_onboard = machine.Pin("LED", machine.Pin.OUT)
# Einfache Variante mit while True-Schleife
# while True:
# led_onboard.toggle()
# time.sleep(1)
# Variante mit try und except, um die LED bei KeyboardInterrupt auszuschalten
try:
while True:
led_onboard.toggle()
time.sleep(1)
except KeyboardInterrupt:
led_onboard.off()
Mit diesem Code und dem Modul machine können ggf. auch andere Mikrocontroller mit MicroPython programmiert werden.
Aber es gibt speziell für den Raspberry Pi Pico ein MicroPython-Modul, das in Anlehnung an das Python-Modul gpiozero entstanden ist und den Namen picozero trägt. Diese Module sind für mich Paradebeispiele für objektorientiertes Programmieren (OOP); man instanziiert ein Objekt, z.B. led, und wendet darauf die Methoden (so nennt man dann die Funktionen) an, z.B. led.on(). Deshalb verwende ich dieses Modul, wenn die Bauteile bereits implementiert sind.
Man sucht und installiert picozero unter Extras/Verwalte Pakete … (engl. Tools/Manage packages …)
Zunächst werden Teile der Module picozero und time importiert. Das Modul picozero kennt die eingebaute LED als pico_led und unterscheidet dabei nicht die verschiedenen Varianten. Der folgende Code funktioniert also sowohl auf dem Pico als auch dem Pico W.
from picozero import pico_led
from time import sleep
while True:
pico_led.on()
sleep(0.5)
pico_led.off()
sleep(0.5)
Wie gesagt, kann man keine externe LED parallelschalten. Deshalb nehmen wir einen beliebigen anderen GPIO-Pin, z.B. GP15 am physischen Pin 20, dem untersten auf der linken Seite des o.a. Pinout-Diagramms.
Beim Anschluss bitte nicht den Vorwiderstand (220 bis 330 Ω) vergessen, damit die LED keinen Schaden nimmt. Bei den LED-Modulen der Sensor-Kits sind diese Vorwiderstände bereits auf der Mini-Platine angebracht. Beim Bi-color LED-Modul benötigt man zwei GPIOs, beim Traffic Light Modul und der RGBLED benötigt man drei GPIOs plus Masseanschluss (=Ground, GND, - )
Code:
from picozero import LED
from time import sleep
led = LED(15)
while True:
led.on()
sleep(0.5)
led.off()
sleep(0.5)
Code für einen einfacher Ampelzyklus mit dem LED Traffic Light Module
from picozero import LED
from time import sleep
redLed = LED(13)
yellowLed = LED(14)
greenLed = LED(15)
while True:
redLed.on()
sleep(2)
yellowLed.on()
sleep(1)
redLed.off()
yellowLed.off()
greenLed.on()
sleep(2)
greenLed.off()
yellowLed.on()
sleep(1)
yellowLed.off()
Gerade bei den mehrfarbigen LEDs möchte man die einzelnen Farben nicht nur ein- oder ausschalten, sondern auch beliebig mischen. Für das Dimmen der einzelnen LEDs benötigt man die Pulsweiten Modulation (PWM, engl. pulse width modulation). Dafür gibt es zwei Möglichkeiten:
Bei der Klasse LED kann man die Methode brightness mit einem Funktionswert zwischen 0 und 1 anwenden.
Beispiel:
led.brightness = 0.5 # half brightness
Bei der Klasse RGBLED wird als Argument ein Tupel mit 8-Bit-Werten (Zahlen zwischen 0 und 255) für die jeweiligen Farbanteile angegeben.
Beispiel:
from picozero import RGBLED
rgb = RGBLED(red=13, green=14, blue=15) # GPIOs
rgb.color = (255, 127, 0) # full red, half green = yellow
Sie haben eine LED in dem Kit entdeckt, die nicht sichtbar blinkt? Das könnte eine IR-LED, das KY-005 IR Transmitter Module sein. Diese IR-LED sendet nicht sichtbares Licht im Infrarotbereich aus, genauso wie die meisten TV-Fernbedienungen. Als Hilfsmittel empfehle ich hier die Kamera des Smartphones. Auf dem Display des Smartphones wird das IR-Signal angezeigt. Das Gegenstück dazu ist das KY-022 IR Receiver Module, das z.B. auch im Smart Car Kit verwendet wird. Die Anwendungsfälle für solch ein Modul sind sehr umfangreich, weswegen ich darauf hier nicht weiter eingehen werden.
Nun zu den weiteren Bauelementen in unseren Kits, die wie eine LED mit Hilfe eines GP-Ausgangs geschaltet werden: diese sind Relais und Aktive Summer (Active Buzzers).
Relais
Relais gehören zu den Bauelementen, die eine externe Spannungsversorgung benötigen. Es gibt also drei Anschlüsse für +, - und S (=Signal). Der Signalpin wird direkt an einem GP-Ausgang angeschlossen, die Spannungsversorgung des Einer-Relais im Kit kann bei Betrieb des Pico am PC an den Pin 40 VBUS angeschlossen werden, GND (-) an einer der vielen GND-Pins (3, 8, 13, 18, 23, 28, 33 oder 38). Besser und bei mehreren Relais notwendig ist eine getrennte Spannungsversorgung z.B. mit Batterien, denn elektromagnetische Verbraucher (Relais, Motoren) haben physikalische Eigenschaften, die sich nicht gut mit empfindlicher Elektronik vertragen. Wichtig ist, dass die GND-Anschlüsse von Pico und externer Batterie verbunden werden.
Für das Schalten des Relais kann man die Klasse LED und die Methoden on() und off() verwenden. Es kann eine Besonderheit auftreten: Es gibt auch Relais-Module, bei denen der Signalpin auf GND (LOW) geschaltet werden muss, damit das Relais anzieht.
Geschaltet wird in einem galvanisch getrennten Stromkreis, d.h. es gibt keine elektrische Verbindung zur Steuerelektronik. Von den drei Schraubanschlüssen ist der mittlere der Eingang, die beiden Äußeren die Ausgänge mit den Bezeichnungen NO=normally open und NC=normally closed. Das bedeutet, dass beim Anziehen des Relais der Ausgang NC geöffnet und NO geschlossen wird.
Aktive Summer (Active Buzzers)
Zunächst muss erklärt werden, worin der Unterschied zwischen aktiven und passiven Summern (Buzzers) besteht. Der Aktive Summer hat in seinem Gehäuse einen eigenen Modulator, der den kleinen Lautsprecher laut und vernehmlich, aber stets mit der gleichen Frequenz summen lässt. Man erkennt ihn an den zwei unterschiedlich langen Beinchen (das längere Beinchen ist +, das kürzere -). Häufig befindet sich noch ein kleiner Aufkleber mit + und - und dem Text „remove after washing“ auf der Oberseite über einem kleinen Loch. Gemeint ist hier „nach dem Einlöten“. Empfehlung: Aufkleber nicht entfernen, die Biester sind auch so laut genug bei Schülerversuchen. Diese Art Buzzer findet man im Haushalt in der Waschmaschine, bei LKWs beim Rückwärtsfahren usw.
Beispielcode mit picozero:
# Active Buzzer that plays a note when powered
from time import sleep
from picozero import Buzzer
buzzer = Buzzer(10) # GPIO Pin
buzzer.on()
sleep(1)
buzzer.off()
sleep(1)
buzzer.beep()
sleep(4)
buzzer.off()
Beim passiven Summer wird die Modulation im Mikrocontroller vorgenommen. Das ist aufwendiger, aber ermöglicht auch unterschiedliche Tonhöhen, um z.B. eine Zweitonfanfare zu bauen, oder eine kleine Melodie zu spielen. Das MicroPython-Modul picozero kennt dazu die Klasse Speaker. Mehr dazu in der Dokumentation von picozero (https://picozero.readthedocs.io/en/latest/)
Im zweiten Teil werden wir die GPIOs als Eingänge kennenlernen.