Orange Blumen

Practical Engineering 2: Bodenfeuchte-Kontrollsystem mit dem RasPi Pico (deutsch)

1. Einleitung

Seit Januar 2021 ist das Raspberry Pi Pico (RasPi Pico) Mikrocontroller Board verfügbar.

Aufgrund des geringen Preises und der Funktions-Vielfalt (u. A. AD-Wandler und zahlreiche PWM-Kanäle) bot es sich an, eine weitere Komponente im Umfeld der ferngesteuerten Pflanzenbewässerung zu entwickeln.

Eine praktische wie komfortable Sache (wenn auch ein wenig eine Spielerei) wäre es zum Beispiel, einen Bodenfeuchte-Sensor in die Erde zu stecken und dann über eine optische Anzeige (z. B. mehrfarbige LED) sofort qualitativ den Feuchtegrad der Pflanzenerde rückgemeldet zu bekommen.

Dies würde den Weg über die RasPi SSH-Shell bzw. eine App ersparen (der RasPi ist ja kein einfacher Mikrocontroller sondern ein vollständiges, wenn auch nicht unbedingt echtzeitfähiges Rechnersystem: siehe Teil 1, Kapitel 6), falls kein Bedarf an einer quantitativen Messung besteht und man ohnehin vor Ort ist.

2. Projekt Bodenfeuchte-Kontrollsystem

Eine Realisierung eines solchen Kleinprojektes ist mit dem Pico nicht allzu schwierig.

Man benötigt neben dem Mikrocontroller Board nur noch einen Bodenfeuchte-Sensor (ich benutze den schon bekannten resistiven Iduino ME110) sowie eine kleine DIY Platine mit RGB-LED einschließlich Vorwiderstände zur Strombegrenzung.

Das kompakte RasPi Pico Mikrocontroller Board (Mitte) mit Bauteilen für die Bodenfeuchte-Messung
Das kompakte RasPi Pico Mikrocontroller Board (Mitte) mit Bauteilen und Verkabelung für den Aufbau des Bodenfeuchte-Kontrollsystems

2.1 Bauteile und Anschlüsse

Die im Projekt genutzten Bauteile sind im einzelnen:

Verwendete Ports auf dem Mikrocontroller Board mit Zuordnung:

  • GP3 – blaue LED
  • GP4 – rote LED
  • GP5 – grüne LED
  • GP26 – Sensorausgang S (AD-Wandler Eingang A0)
  • Pin 36 – 3,3V Sensor-Versorgung
  • Pin 8, Pin 38 – GND

2.2 Kontrollrechnungen

Da ich keine 50 Ohm Widerstände zur Hand hatte, schaltete ich für die drei LEDs die ich verwenden wollte jeweils zwei 100 Ohm Widerstände parallel.

Der (theoretische) Strom durch eine grüne LED beträgt somit in etwa:

ILEDgr, th = (UGP5[V]-USchwell gr, th[V])/R[Ω] = (3,3-2,2)/50 = 22mA

Durch eine rote LED:

ILEDrot, th = (UGP4[V]-USchwell rot, th[V])/R[Ω] = (3,3-1,9)/50 = 28mA

Auch wenn mir das Stromlimit der GP Ports nicht genau bekannt ist erwartete ich bei Strömen dieser Größenordnung an GP4 bzw. GP5 keine größeren Probleme. Zur Sicherheit führte ich dennoch eine Reihe von Kontrollmessungen durch (siehe Kapitel 2.3) und testete den Aufbau in einer Art Langzeitbetrieb.

Es sei noch angemerkt dass der Strom über die (hier vorerst nicht verwendete) blaue LED aufgrund der vergleichsweise hohen Schwellenspannung (etwa 3,0V) weit geringer wäre.

Überhaupt sind LED-Schwellenspannungen starken Exemplarstreuungen unterworfen. Bei Bedarf sollte man daher Messungen am individuellen Bauteil durchführen.

Die Empfehlung für das Stromlimit an Pin 36 lautet 300 mA (der Sensor benötigt weniger als 20mA), wobei die Bodenfeuchte-Sensorik durchaus auch mit den 5V von Pin 40 (Signal VBUS, also USB-Spannung) versorgt werden könnte.

2.3 Kontrollmessungen

Für mich etwas überraschend war was die Kontrollmessungen zu Tage förderten.

Der Strom am individuellen GP Port wird chipintern auf zwischen 12-14 mA begrenzt, und man misst bei voller Ansteuerung (Dezimalwert 65.535) z. B. der grünen LED nur noch eine Spannung von etwa 2,7V.

Im Datenblatt des RP2040-Mikrocontrollers gibt es in Kapitel 2.10.5. einen Hinweis zum Stromlimit.

Der Ist-Strom durch die grüne LED berechnet sich mit den ermittelten Werten nach (trennt man die Leitungen auf kann man den Strom auch direkt messen):

ILEDgr, ist = (UGP5[V]-USchwell gr, ist[V])/R[Ω] = (2,7-2,1)/50 = 12mA

3. Coding mit MicroPython

Mein LED-Ansteuerungscode ist zum großen Teil copy&paste und eigentlich trivial (hier kann man ihn einsehen bzw. einen Klon des ganzen Repositories erstellen; der verlinkte Code beinhaltet zusätzlich Ansteuerungs-Anweisungen für eine einzelne Siebensegmentanzeige).

Anzumerken ist, dass der Sensor trotz seiner Versorgung mit 3,3V einen (theoretischen) Maximaloutput von 1,7V an Pin S (Wert aus dem ME110 Datenblatt für komplett nasse Erde) hat, was der Algorithmus berücksichtigen sollte1. Der erlaubte Bereich für die ADC-Eingangsspannung geht ohne externe Referenz bis 3,3V (Pin 35, ADC_VREF).

Logik: Die Helligkeit der grünen LED wird bei Kontakt mit dem Medium je nach Feuchtegrad linear in dem Maße verringert wie die Helligkeit der roten LED erhöht wird (und vice versa).

Keine sonderlich ausgeklügelte Mathematik die aber für den Anfang und für Präsentationszwecke ganz gute Ergebnisse liefert.

Die Helligkeits-Steuerung selbst geschieht über eine sogenannte Pulsweitenmodulation (PWM) im range 0 – 65.535 (16bit Auflösung).

Dieser Wert bestimmt letztlich den Tastgrad (0% – 100%) der PWM.

Da ich ferner keinen Motor o. Ä. ansteuere ist die Höhe der anzugebenden PWM-Frequenz nicht so wichtig (gewählt wurden für GP3, GP4, GP5 500 Hz). Aus offensichtlichen Gründen wäre es aber gut wenn die LEDs nicht flackern.

Das Programm fordert über den Befehl “ADC.A0.read_u16()” einen 16bit Wert an, etwas verwirrend aufgrund der Tatsache dass auf dem Board eigentlich ein 12bit ADC verbaut ist (der 12bit Wert wird skaliert2). Dies gestaltet die weitere Verarbeitung bei meinem Anwendungsfall komfortabel.

1 siehe Codebeispiel: in Python bzw. MicroPython erfolgt bei Rechenoperationen mit float und integer immer die implizite Umwandlung des Ergebnisses in float. Für die PWM benötigt man am Ende der Rechenoperation natürlich einen integer-Wert

2 die Mathematik hinter dieser Skalierung ist nach meiner Recherche eine sog. Taylor-Expansion; Pseudocode: rohwert << (16 – 12) | rohwert >> (2 * 12 – 16)

4. Praktischer Einsatz

4.1 Betrieb am Rechnersystem

Ich benutze auf der Windows Plattform das Programm Thonny, das man hier herunterladen kann. Damit ist ein Live-Update des Codes und eine sofortige Ergebniskontrolle möglich.

Auf einem RasPi 3 und 4 ist Thonny normalerweise schon vorinstalliert, daher wäre ein ad-hoc Betrieb über einen RasPi USB-Port ebenfalls eine Option.

4.2 Standalone-Betrieb (Code Flash)

Der SW-Flash war über meinen RasPi 3, Modell B+ recht unkompliziert (Abspeicherung des Skripts als “main.py” im Pico-Speicher via Thonny).

Das Programm Thonny (auf dem RasPi)
Das Programm Thonny (auf dem RasPi)

Über einen Windows-PC ist es unter Umständen etwas aufwändiger, aber grundsätzlich sollte ein Flash auch hier keine Probleme bereiten (ggf. mit zusätzlichen SW-Installationen).

Anschließend benötigt man nur noch eine Spannungsversorgung, ein Rechner ist nun überflüssig da eine automatische Ausführung des Codes erfolgt.

5. Ausblick

Selbstverständlich ist mein Aufbau auch wieder eine Art open-end Projekt und schöpft kaum die unzähligen Möglichkeiten eines RasPi Pico und von verfügbarer Hardware aus.

Insbesondere der verwendete Bodenfeuchte-Sensor hat aufgrund seines Messprinzips eine Reihe von Nachteilen und wäre somit ein Kandidat für eine Verbesserungsaktion (das heißt Umstieg auf kapazitive Sensorik, z.B. HW-390).

Eine von vielen weiteren Anzeige-Möglichkeiten: Siebensegmentanzeigen betrieben mit acht GP Ports und zwei CD4511BE Bausteinen (hier benutzt ein kapazitiver Sensor HW-390)
Eine von vielen weiteren Anzeige-Möglichkeiten: Siebensegmentanzeigen betrieben mit acht GP Ports und zwei CD4511BE Bausteinen (hier benutzt ein kapazitiver Sensor HW-390)

Da der Pico drei ADC-Eingänge besitzt ist ein Betrieb auch mehrerer Sensoren problemlos möglich. Durch eine externe Referenzspannung kann die Leistung des ADC aufgebohrt werden (hierzu siehe Pico Datenblatt Kapitel 4.3).

Auch ein anderes Anzeige-Design sei natürlich der Phantasie des Entwicklers überlassen (z.B. LCD-Display am I2C-Bus), und wird an der Stelle nicht ausführlicher diskutiert.

Ein Projekt mit Siebensegmentanzeige ist jedoch unter diesem Link näher beschrieben.