Taglilie

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

1. Einleitung

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

Aufgrund des verhältnismäßig geringen Preises (einstelliger Euro-Bereich), der relativ einfachen Handhabung und der Funktions-Vielfalt 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) eine qualitative Rückmeldung zum aktuellen Feuchtegrad der Pflanzenerde zu erhalten.

Dies würde den Weg über die RasPi SSH-Shell bzw. eine App ersparen (der RasPi ist ja kein 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 vorgestellten 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 und Verkabelung für den Aufbau eines simplen Bodenfeuchte-Kontrollsystems
Das kompakte RasPi Pico Mikrocontroller Board (Mitte) mit Bauteilen und Verkabelung für den Aufbau eines äußerst simplen Bodenfeuchte-Kontrollsystems

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 (AD-Wandler Eingang A0)
  • Pin 36 – 3,3V Sensor-Versorgung
  • Pin 8, Pin 38 – GND (AGND nicht benötigt)

1 hier noch der Hinweis, dass beide Kathoden der LED mit GND zu verbinden sind (siehe Datenblatt)

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 300mA (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 waren die 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.

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

3. Coding mit MicroPython

Mein MicroPython LED-Ansteuerungscode ist zu großen Teilen copy&paste und im Prinzip 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 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 sowie für Präsentations- und Lernzwecke 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 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 Mathematik hinter dieser Skalierung ist nach meiner Recherche eine sog. Taylor-Expansion; Pseudocode: rohwert << (16 – 12) | rohwert >> (2 * 12 – 16)

4. Produktiver Test

Da nicht etwa über einen In-System-Programmer (ISP) sondern ausschließlich über die USB-Schnittstelle geflasht wird, muss zuallererst eine Bootloader als .uf2-Datei (USB Flashing Format) auf das Gerät gebracht werden.

Eine Anleitung dazu und den aktuellen Bootloader gibt es unter dem schon erwähnten Link.

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 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 war über meinen RasPi 3, Modell B+ unkompliziert (Abspeicherung des Skripts als “main.py” im Pico-Speicher via Thonny).

Das Programm Thonny (auf dem RasPi)
Das Programm Thonny (hier auf einem Linux-System)

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

Anschließend benötigt man nur noch eine Spannungsversorgung, ein Rechnersystem ist nun überflüssig da das Mikrocontroller-Programm automatisch aufgeführt wird.

5. Ausblick

Selbstverständlich ist der beschriebene Aufbau wieder eine Art open-end Projekt und schöpft eher nicht die unzähligen Möglichkeiten eines RasPi Pico sowie von Hardware und Erweiterungen aus.

Insbesondere 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 ADC-Eingänge besitzt wäre ein paralleler Betrieb auch mehrerer Sensoren problemlos 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-Display am I2C-Bus), und wird an der Stelle nicht weiter ausgeführt.

Ein Projekt mit Siebensegmentanzeigen ist jedoch unter diesem Link näher erläutert (siehe obige Fotos; hier kommt ein kapazitiver HW-390 Sensor zum Einsatz).

6. Literatur

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