Taglilie

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

1. Einleitung

Seit Anfang 2021 ist das Raspberry Pi Pico (im Weiteren RasPi Pico genannt) 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:

  • RasPi Pico – Datenblatt, RP2040 Datenblatt
  • RGB-LED1 Datenblatt
  • Resistiver Bodenfeuchte-Sensor – Datenblatt
  • 6xWiderstand 100 Ohm (Metallschicht verwendet)
  • Micro-USB Kabel
  • Buchsen- und Steckerleisten, Schaltlitze (0,14 mm² verwendet), Schrumpfschlauchstücke

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-Versorgung2
  • 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 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 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 da ich mit der HW noch nicht wirklich vertraut war.

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 kompletten github 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 aufweist (Wert aus dem ME110 Datenblatt für vollkommen nasse Erde), was der Algorithmus berücksichtigen sollte3. 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).

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

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 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 skaliert4). Dies gestaltet die weitere Verarbeitung bei meinem Anwendungsfall komfortabel.

3 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

4 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 ausschließlich über die USB-Schnittstelle programmiert und geflasht wird muss zuallererst die MicroPython Firmware in Form eines .uf2-Files (USB Flashing Format) auf den Pico kopiert werden.

Eine Anleitung dazu – im Grunde ist es nicht vielmehr als den BOOTSEL Taster während des Einsteckens zu drücken 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. 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: das Skript wird einfach als “main.py” in den Pico-Speicher abgelegt (via Thonny GUI).

Das Programm Thonny (hier auf unixoidem Betriebssystem)
Das Programm Thonny (hier auf unixoidem Betriebssystem)

Über einen Windows-PC funktioniert es etwas anders, grundsätzlich sollte ein Flash aber auch hier keine Probleme bereiten (ggf. mit zusätzlichen Tool-Installationen, habe das selber nicht ausprobiert).

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

Ist diese Arbeit getan benötigt man nur noch eine Spannungsversorgung; ein Rechnersystem wäre nun überflüssig da das MicroPython-Programm automatisch aufgeführt wird.

5. Technische Erweiterungen

Selbstverständlich ist der beschriebene Aufbau wieder eine Art open-end Projekt und schöpft eher nicht die unzähligen SW-Möglichkeiten eines RasPi Pico, sowie von HW 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 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 ausgeführt.

Ein Projekt mit “gemultiplexten” Siebensegmentanzeigen ist jedoch auf meiner hackaday.io Projektseite näher erläutert (siehe obige Fotos; hier kommt ein als HW-390 bezeichneter kapazitiver Sensor zum Einsatz).

6. Literatur

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