Taglilie

Bodenfeuchte-Messung mit dem Raspberry Pi Pico

1. Einleitung

Seit Anfang 2021 ist das Raspberry Pi Pico (im Weiteren RasPi Pico genannt) Mikrocontroller Board der Raspberry Pi Foundation verfügbar.

Aufgrund der relativ einfachen Programmiermöglichkeiten und der Funktions-Vielfalt bot es sich an eine weitere Komponente im Umfeld der ferngesteuerten Pflanzenbewässerung zu entwickeln.

Eine komfortable Sache (wenn auch ein wenig eine Spielerei) wäre es zum Beispiel, einen Bodenfeuchte-Sensor in die Erde zu stecken und über eine optische Anzeige (z. B. mehrfarbige LED) eine qualitative Rückmeldung zum aktuellen Feuchtegrad der Pflanzenerde zu bekommen.

Dies würde den Weg über die RasPi SSH-Shell bzw. eine App ersparen (der RasPi ist ja kein Mikrocontroller sondern ein vollständiger Rechner inkl. Betriebssystem: siehe Teil 1, Kapitel 6), falls kein Bedarf an einer quantitativen Messung besteht und man ohnehin vor Ort ist.

2. Projekt Bodenfeuchte-Kontrollsystem

Die Realisierung eines solchen Einsteigerprojektes ist mit dem RasPi Pico nicht sehr schwierig (hier kann man gleich zur Präsentation springen).

Man benötigt neben dem Board lediglich einen Bodenfeuchte-Sensor (ich benutze vorerst wiederum einen resistiven Iduino ME110) sowie eine kleine DIY Platine mit RGB-LED einschließlich Vorwiderstände zur Strombegrenzung.

2.1 Bauteile und Anschlüsse

Die in diesem 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 (ADC Eingang A0)
  • Pin 36 – 3,3V Sensor-Versorgung1
  • Pin 8, Pin 38 – GND (AGND nicht benötigt)

1 es handelt sich hier um eine sog. ratiometrische Sensorschnittstelle da die Versorgungsspannung des Sensors gleichzeitig die Referenzspannung für den ADC ist

2.2 Kontrollrechnungen

Da ich keine 47 oder 56 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 eher keine signifikanten Probleme (Messungen siehe Kapitel 2.3).

Es sei noch angemerkt dass der theoretische Strom über die (hier 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 300mA (der Sensor benötigt weniger als 20mA), wobei der Bodenfeuchte-Sensor 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 waren Werte der Kontrollmessungen.

Der Strom am individuellen GP Port wird chipintern auf zwischen 12-14 mA begrenzt, und man misst bei voller Ansteuerung (Dezimalwert 65.535, siehe weiter unten) 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; davon abgesehen ist es etwas unklar wie hoch “erlaubte” Ströme eigentlich sein dürfen.

Der Ist-Strom durch die grüne LED berechnet sich mit den Messwerten 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

Die praktische Maßnahme aus dieser Erkenntnis wäre nun alle Widerstandswerte zu erhöhen, oder ein anderes Konzept etwa mit einer Transistorschaltung umzusetzen.

3. Coding mit MicroPython

MicroPython Ansteuerungsprogramme finden sich in meinem RasPi Github-Repository.

Dieser Code beinhaltet neben der LED-Ansteuerung zusätzlich Befehle zur Ansteuerung einer einzelnen Siebensegmentanzeige.

Anzumerken ist, dass der Sensor trotz seiner Versorgung mit 3,3V einen Maximaloutput von circa 1,7V an Pin S aufweist (Wert aus dem ME110 Datenblatt für vollkommen nasse Erde), was der Algorithmus berücksichtigen sollte2. 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, das heißt für Präsentations- und Lernzwecke ganz gute Ergebnisse liefert.

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

PWM zur Helligkeitssteuerung einer LED (Demo zum Anklicken)
PWM zur Helligkeitssteuerung einer LED (Demo zum Anklicken)

Dieser 16bit-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 kritisch (gewählt wurde für GP3, GP4, GP5 eine Frequenz von 500 Hertz). 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 im Board eigentlich ein 12bit ADC implementiert ist (der 12bit Wert wird skaliert3). Dies gestaltet die weitere Verarbeitung bei meinem Anwendungsfall komfortabel.

2 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

3 die in einer der libs verborgene Mathematik hinter dieser Skalierung ist nach meiner Kenntnis eine sog. Taylor-Expansion; Pseudocode: rohwert << (16 – 12) | rohwert >> (2 * 12 – 16)

4. Produktiver Test

Da die Interaktion mit dem Gerät ausschließlich über die USB-Schnittstelle stattfindet muss zuallererst die MicroPython Firmware in Form eines .uf2-Files (USB Flashing Format) auf den Pico geflasht werden.

Eine Anleitung dazu – im Grunde ist es nur den BOOTSEL Taster während des Einsteckens gedrückt zu halten und anschließendes drag&drop – und das aktuellste File gibt es unter diesem Link.

4.1 Betrieb am Rechner

Ich benutze auf der Windows Plattform das Programm Thonny, das man hier herunterladen kann. Mit diesem Tool ist ein live Update des Codes und eine sofortige Ergebniskontrolle möglich.

Auf einem RasPi 3 oder 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” (eher ein banales Kopieren) war über meinen Raspberry Pi 3 unkompliziert: das Skript wird einfach als “main.py” in den Pico-Speicher abgelegt (via Thonny GUI).

Das Tool Thonny
Das Tool Thonny

Natürlich besteht daneben immer die (per se bessere) Möglichkeit, ein kompiliertes C-Programm als .uf2-File oder .elf-File in den Speicher zu flashen, welches dann natürlich eine MicroPython Firmware oder andere bereits geflashte Dateien überschreibt4.

Ist diese Arbeit getan benötigt man nur noch eine Spannungsversorgung; ein Rechnersystem wäre nun überflüssig da das Programm beim Einstecken automatisch startet.

4 ein .uf2-File wird in einen speziellen Speicherbereich des Pico abgelegt (” […] UF2 file […] is written to specified locations in RAM or Flash.”, Kapitel 2.8.3.1 im RP20240 Datasheet); ein schon vorhandenes main.py Skript bleibt unangetastet da es sich in einem völlig anderen Speicherbereich befindet

5. Technische Erweiterungen

Selbstverständlich ist der beschriebene Aufbau nur für den Einstieg gedacht und schöpft eher nicht die unzähligen SW-Möglichkeiten eines RasPi Pico, sowie von HW und Erweiterungen aus.

Besonders der verwendete Bodenfeuchte-Sensor weist aufgrund seines Messprinzips eine Reihe von Nachteilen auf und ist ein Kandidat für eine Aufwertungsmaßnahme (das heißt Umstieg auf kapazitive Sensorik).

Da der Pico drei externe ADC-Pins besitzt (GP26, GP27, GP28) wäre prinzipiell ein paralleler Betrieb auch mehrerer Sensoren möglich. Durch eine externe Referenzspannung kann die Leistung des ADC verbessert werden (hierzu siehe Pico Datenblatt, Kapitel 4.3.).

Auch ein anderes Anzeige-Design sei natürlich der Phantasie des Entwicklers überlassen (z. B. LCD oder OLED-Display am I2C-Bus) und wird an dieser Stelle nicht weiter thematisiert.

Ein Projekt mit zwei Siebensegmentanzeigen ist jedoch auf meiner hackaday.io-Projektseite näher erläutert.

6. Literatur

1. Mikroprozessortechnik – Klaus Wüst, Vieweg+Teubner; ISBN 978-3-8348-0906-3 (4. Auflage)

2. Elektronik Tabellen: Betriebs- und Automatisierungstechnik – Michael Dzieia, Westermann; ISBN 978-3142350165 (4. Auflage)