Raspberry Pi Zero 2 W – wat rommelen …

Inmiddels twee exemplaren van de Raspberry Pi Zero 2 W in bezit. Ik heb elk voorzien van Raspberry Pi OS, 32bits Bookworm (Debian): RaspiZero1 op een 8GB micro-SD-kaartje en RaspiZero2 op een 32GB micro-SD-kaartje.
De RaspiZero2 is volledig uitgerust: naast de voeding, een mini-HDMI naar HDMI-kabel voor het beeldscherm, op de USB aansluiting een OTG-kabeltje met dongle voor draadloze set; muis en toetsenbord.

RaspiZero2

De RaspiZero1 heeft alleen een voeding en wordt dus ‘headless’ ingezet; dat wil zeggen dat de besturing vanaf mijn hoofdcomputer (Venus) over het draadloze WiFi-netwerk verloopt. Met deze Zero wil ik wat experimenteren met de GPIO-pinnen. Om dat te kunnen doen heb ik er de daarvoor benodigde 40-pins header opgezet.
Vervolgens heb ik het een en ander geactiveerd; o.a. SSH, SPI, I2C, Serial Port, 1-wire, Remote GPIO.

Als eerste heb ik een LED-array aangesloten. Zie hieronder.

Deze LED-array heeft 6 blauwe ledjes met elk een voorschakelweerstand en een gezamenlijke gnd aansluiting. Hieronder zie je de module aangesloten op de GPIO-pinnen van de Zero. Ik kwam er achter dan (natuurlijk) niet alle GPIO pinnen zomaar te gebruiken zijn. Op de 40-pins bus is een aantal, de hieronder groen gemarkeerde, pinnen zondermeer wél te gebruiken. Andere pinnen hebben meerdere functies en die kunnen soms dus niet meewerken. 🙂

Met GPIO4 en 18 heb ik wat zitten stoeien: soms werkte het wel, soms kreeg ik foutmeldingen in Python. Waarom dat was bleef mij vooralsnog onduidelijk.

RaspiZero1 met de LEDs 1, 3 en 6 aan (van boven naar beneden).

Om de LEDs aan en uit te zetten heb ik gebruikgemaakt van het (reeds met Raspberry Pi OS op de Zero geïnstalleerde) Flask. Hiermee is in Python een simpele webserver op te zetten.

Ik had het boek “The Raspberry Pi Zero 2 W GO! Book” geschreven door Dogan Ibrahim en uitgegeven door Elektor aangeschaft. Jammer genoeg werkte het daarin opgenomen Python script niet! Het boek is in 2023 uitgegeven (het is nu 2025) en het opgenomen script maakt gebruik van een GPIO-library die inmiddels niet meer door de Zero gebruikt wordt en vervangen moet worden door de “gpiozero” library. Gemini AI heeft me goed geholpen om een alternatief programma te maken. Dit programma (app.py) is in een directory “server” op de Zero gezet. Na wat aanpassingen werkte het prima!

NB @Gemini!
Ik had gevraagd om een webpagina om vanuit Python, met een knop een LED aan en uit te zetten.
Ik kreeg een Python-script en een HTML-pagina voorgesteld. Het maakte gebruik van de GPIO-library die ik dus niet wilde.
Toen ik vertelde dat ik gebruik wilde maken van gpiozero kwam er een tweede voorstel: dat werkte direct! Alleen werd er telkens een nieuwe pagina geopend na het aanklikken van een aan- of uitknop, Vervolgens aangegeven dat ik op dezelfde pagina wilde blijven.
Ik kreeg een voorstel met Javascript. Aangegeven dat ik geen gebruik wilde maken van Javascript.
Uit eindelijk (onderstaand) voorstel met dat gebruikmaakt van GET en POST.

Ik weet niet zo goed wat ik van AI moet vinden, maar dit vond ik werkelijk geweldig!

from flask import Flask, render_template, request
from gpiozero import LED


app = Flask(__name__)
led1 = LED(18)
led2 = LED(23)
led3 = LED(24)
led4 = LED(25)
led5 = LED(12)
led6 = LED(16)


@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        if "led1_aan" in request.form:
            led1.on()
            status = "LED 1 ingeschakeld"
        elif "led1_uit" in request.form:
            led1.off()
            status = "LED 1 uitgeschakeld"
        elif "led2_aan" in request.form:
            led2.on()
            status = "LED 2 ingeschakeld"
        elif "led2_uit" in request.form:
            led2.off()
            status = "LED 2 uitgeschakeld"
        elif "led3_aan" in request.form:
            led3.on()
            status = "LED 3 ingeschakeld"
        elif "led3_uit" in request.form:
            led3.off()
            status = "LED 3 uitgeschakeld"
        elif "led4_aan" in request.form:
            led4.on()
            status = "LED 4 ingeschakeld"
        elif "led4_uit" in request.form:
            led4.off()
            status = "LED 4 uitgeschakeld"           
        elif "led5_aan" in request.form:
            led5.on()
            status = "LED 5 ingeschakeld"
        elif "led5_uit" in request.form:
            led5.off()
            status = "LED 5 uitgeschakeld"
        elif "led6_aan" in request.form:
            led6.on()
            status = "LED 6 ingeschakeld"
        elif "led6_uit" in request.form:
            led6.off()
            status = "LED 6 uitgeschakeld"            
        else:
            status = ""
        return render_template("index.html", status=status)
    return render_template("index.html", status="")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80)

In de directory server maak je een directory “templates” aan waar de html-pagina komt te staan. Hieronder mijn eerst werkende webpagina (Index.html).

<!DOCTYPE html>
<html>
<head>
    <title>GPIO-bediening</title>
</head>
<body>
    <h1>GPIO-bediening</h1>

    <form method="post">
		LED 1
        <button type="submit" name="led1_aan">Aan</button>
        <button type="submit" name="led1_uit">Uit</button>
    </form>

    <form method="post">
		LED 2
        <button type="submit" name="led2_aan">Aan</button>
        <button type="submit" name="led2_uit">Uit</button>
    </form>
	
    <form method="post">
		LED 3
        <button type="submit" name="led3_aan">Aan</button>
        <button type="submit" name="led3_uit">Uit</button>
    </form>

    <form method="post">
		LED 4
        <button type="submit" name="led4_aan">Aan</button>
        <button type="submit" name="led4_uit">Uit</button>
    </form>
	
    <form method="post">
		LED 5
        <button type="submit" name="led5_aan">Aan</button>
        <button type="submit" name="led5_uit">Uit</button>
    </form>

    <form method="post">
		LED 6
        <button type="submit" name="led6_aan">Aan</button>
        <button type="submit" name="led6_uit">Uit</button>
    </form>
	
    <p>{{ status }}</p>
</body>
</html>

Hieronder het resultaat: de webpagina op de Zero met de ‘knoppen’ om de 6 ledjes aan en uit te zetten en daaronder de laatste opdracht weergegeven.

De eenvoudige webpagina.

De “ontwikkelomgeving”

Een mix van Notepad++, PuTTY en WinSCP.
Alles gebeurt vanaf mijn standaard computer; met de editor Notepad++ heb ik daarop de bestanden “app.py” en “Index.html” aangemaakt en in een map op het bureaublad opgeslagen.
Op de RaspiZero1 heb ik in mijn home-directory een directory “server”, met daarin een directory “templates”, gemaakt.
Met het programma WinSCP (een soort Commander) kan je heel makkelijk verbinding maken met de Zero en de gemaakte (en de daarna telkens aangepaste) bestanden naar de Zero kopiëren: “app.py” naar directory server, “Index.html” naar de director “templates”.
Met PuTTY maak ik verbinding met de Zero en start vanuit de directory “server” de Flask server met de opdracht:

sudo python3 app.py

De server is met <CTRL><C> te stoppen.

Zo ziet de schermvulling eruit!

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie gegevens worden verwerkt.