In vielen Anwendungsfällen rund um Mikrocontroller spielt das Verarbeiten analoger Werte eine tragende Rolle. Wir stellen Ihnen die analogen Funktionen in MicroPython vor.
Bevor wir mit dem Programmieren beginnen, sollten wir zunächst genau abgrenzen, was die Begriffe analog und digital bedeuten. Das Wort digital leitet sich in unserem Kontext vom englischen “digit” für Ziffer ab [1]. In der Computertechnik spricht man von einem Bit (Binary Digit), also einer Ziffer, die genau die zwei Werte 0 und 1 annehmen kann. In der Elektronik stehen Sie üblicherweise für wahr (TRUE, HIGH) und falsch (FALSE, LOW). In der realen Welt repräsentieren unterschiedliche Spannungen die beiden Werte: 0 Volt für falsch und 5 oder 3,3 Volt für wahr. Im CPU-Umfeld kommen noch niedrigere Spannungen vor. In der Messtechnik und Datenübertragung dient oft die Stromflussrichtung als Indikator für einen Wert. Dieses Verfahren ist weniger anfällig für Störungen von außen.
In der analogen Welt sieht das ein wenig anders aus – dort können unendlich viele Werte auftreten. Konkret steckt dahinter, dass zum Beispiel zwischen 0 und 5 Volt beliebig viele Spannungswerte liegen. Möchten Sie analoge Werte im Computer verarbeiten, müssen Sie sie in Zahlen umwandeln. Dabei entspricht ein einzelnes Bit einem bestimmten Spannungsunterschied, der von der im Wandler verwendeten Referenzspannung und der Anzahl der bei der Wandlung genutzten Bits abhängt. Das bedeutet, dass bei der Wandlung von analog zu digital Werte verloren gehen und sich auf umgekehrtem Weg nicht alle möglichen Werte erzeugen lassen.
Konkret heißt das, dass sich bei einem 8-Bit-Wandler und einer Referenzspannung von 5 Volt Spannungsschritte von ungefähr 0,02 Volt ergeben. Das ist schon recht niedrig und genügt für die meisten Anwendungsfälle vollkommen. Die Abkürzungen D/A- und A/D-Wandlung stehen dabei für Digital-zu-Analog- und Analog-zu-Digital-Wandlung.
Setup
Für unseren Versuch haben wir uns für den Mikrocontroller ESP32 und Thonny als IDE entschieden.
Thonny installieren Sie unter Ubuntu über das Software Center. Bitte achten Sie aus Aktualitätsgründen darauf, das Snap-Paket zu nutzen. Das korrespondierende DEB ist schon leicht angestaubt. Für alle anderen Betriebssysteme laden Sie Thonny von der Projektwebseite [2] herunter.
Das ESP32-Dev-Board [3] kommt zum Einsatz, weil der Mikrocontroller sowohl analoge Ein- als auch Ausgänge mitbringt. Für das ESP32-Dev-Board benötigen Sie die passende MicroPython-Firmware [4], die Sie zusammen mit der IDE beziehen und auf den Mikrocontroller spielen.
Navigieren Sie dazu in Thonny zu Werkzeuge | Optionen | Interpreter und wählen Sie dort MicroPython (ESP32) aus. Anschließend klicken Sie unten rechts auf den blauen Link MicroPython installieren oder aktualisieren. Daraufhin öffnet sich der Dialog aus Abbildung 1. Bitte wählen Sie hier die zu Ihrem Board passenden Parameter aus und klicken Sie auf installieren, damit Thonny die passende Firmware integriert. Nun können Sie sämtliche Dialoge schließen; die IDE ist jetzt bereit, den ESP32 zu verwenden. Unten rechts in Abbildung 2 sehen Sie, dass eine Verbindung zum Python-Interpreter auf dem Controller besteht.

Abbildung 2: In der Entwicklungsumgebung sehen Sie unten rechts im Fenster, dass die Verbindung zum ESP32 funktioniert.
Testaufbau
Als Quelle für die analogen Werte verwenden wir einen kleinen Joystick [5], den wir wie in Abbildung 3 gezeigt mit dem Dev-Board verbinden (siehe Tabelle “Verbindungen zum Joystick”). Der Joystick liefert an seinen zwei Ausgängen abhängig von der Position eine Spannung zwischen 0 und 3,3 Volt. In Mittelstellung rangiert die Spannung bei etwa 3,3 Volt beziehungsweise 2 Volt. Um die analoge Ausgabe zu testen, schließen wir ein Multimeter oder Oszilloskop zwischen GPIO25 und GND. Hier erwarten wir ebenso Messwerte zwischen 0 und 3,3 Volt.

Abbildung 3: Im Testaufbau auf einem Breadboard dient ein Joystick als Quelle für die analogen Werte.
|
Joystick |
ESP23 Dev-Board |
|---|---|
|
GND |
GND |
|
+5V |
+3,3V |
|
VRX |
GPIO34 |
|
VRY |
GPIO35 |
Testprogramm A/D
Das Testprogramm aus Listing 1 fragt die analogen Werte des Joysticks ab und zeigt sie auf dem Bildschirm an. Im ersten Schritt importieren Sie dazu im Programm die nötigen Bibliotheken (erste Zeile). Danach legen Sie die Pins 34 und 35 als analoge Eingänge fest (zweite und dritte Zeile).
Zu den analogen Eingängen des ESP32 gibt es außerdem einige Randinformationen, die nötig sind, um zu verstehen, was in den nächsten Zeilen passiert. Standardmäßig hat der A/D-Wandler des ESP32 bei einer Genauigkeit von 12 Bit einen Eingangsspannungsbereich von 100 bis 950 mV. Da die Parameter nicht für jeden Anwendungsfall passen, lassen sie sich per Software mit den Methoden machine.ADC.atten() (Dämpfung des Eingangssignals) und machine.ADC.width() (Anzahl der Bits für die Wandlung) ändern.
In der Tabelle “Dämpfung des Eingangssignals” und der Tabelle “Anzahl Bits bei der Wandlung” finden Sie die möglichen Parameter für die beiden Methoden beschrieben. In unserem Beispiel stellen wir die Dämpfung der Eingänge auf 11 dB ein (Zeilen 4 und 5). Danach lesen wir die Werte der Eingänge in einer Endlosschleife aus und geben sie auf der Konsole aus. Das Kommando time.sleep() aus der letzten Zeile verlangsamt die Ausführung des Programms etwas, um dem Wandler genug Zeit zu verschaffen, auch Werte zu liefern. Ohne das sleep() entwickelt die Ausgabe einen Zeitversatz.
Listing 1
Testprogramm A/D
import machine,time
vrx = machine.ADC(34)
vry = machine.ADC(35)
vrx.atten(machine.ADC.ATTN_11DB)
vry.atten(machine.ADC.ATTN_11DB)
while True:
print ("x:"+str(vrx.read()))
print ("y:"+str(vry.read()))
time.sleep(0.1)
|
Parameter |
messbare Eingangsspannung |
Dämpfung |
|---|---|---|
|
|
100 bis 950 mV |
0 dB |
|
|
100 bis 1250 mV |
2,5 dB |
|
|
150 bis 1750 mV |
6 dB |
|
|
150 bis 2450 mV |
11 dB |
Wie die Tabelle “Anzahl Bits bei der Wandlung” zeigt, liegt der Eingangsspannungsbereich des ESP32 bei 11 dB Dämpfung zwischen 150 2450 mV. Wir verwendeten in unserem Testaufbau 0 bis 3,3 Volt, was bedeutet, dass wir beim Aufbau der Schaltung einen Fehler gemacht haben. Interessanterweise fällt das beim Bedienen des Joysticks kaum auf. Nur wenn man sehr genau darauf achtet, merkt man, dass die Genauigkeit in eine Richtung geringer ausfällt als in die entgegengesetzte. Wenn wir die analogen Eingänge für echte Messanwendungen verwenden möchten, müssen wir uns mehr Gedanken über den Elektronikteil des Projekts machen.







