{"id":4362,"date":"2026-02-23T08:57:08","date_gmt":"2026-02-23T07:57:08","guid":{"rendered":"https:\/\/staging.elv.eqxt.de\/?p=4362"},"modified":"2026-06-12T12:33:11","modified_gmt":"2026-06-12T10:33:11","slug":"python-einstieg-teil5-analoge-werte","status":"publish","type":"post","link":"https:\/\/de.elv.com\/elvjournal\/python-einstieg-teil5-analoge-werte\/","title":{"rendered":"Einstieg in Python (Teil 5): Erfassung analoger Werte"},"content":{"rendered":"\n<p class=\"has-gray-light-color has-text-color has-link-color has-h-5-font-size wp-elements-0d7f031746d902f30b2072c7df76d513 wp-block-paragraph\"><strong>Einstieg in Python, Teil 5<\/strong><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Erfassung analoger Werte<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Einer der wesentlichen Nachteile des Raspberry&nbsp;Pi gegen\u00fcber vielen Mikrocontrollern wie dem Arduino oder dem ESP32 ist, dass der Pi nicht \u00fcber analoge Eing\u00e4nge verf\u00fcgt. Die reale Welt ist aber analog. Bei Sonnenaufg\u00e4ngen wird es allm\u00e4hlich hell. Lufttemperaturen \u00e4ndern sich stetig und nicht sprunghaft. Um also Umweltparameter exakt erfassen zu k\u00f6nnen, ist das Messen analoger Werte erforderlich. Auch bei dieser Aufgabe zeigt Python seine universelle Funktionalit\u00e4t. So ist es mit speziellen Verfahren m\u00f6glich, ein Python-Programm zu erstellen, das analoge Werte erfassen kann, ohne dass dazu zus\u00e4tzliche Hardware erforderlich w\u00e4re. Will man allerdings Messwerte mit hoher Pr\u00e4zision erfassen, kommt man um einen Analog-Digital-Konverter nicht herum. Der MCP3002 leistet hier gute Dienste.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beitrag werden wir die Erfassung analoger Messwerte ausf\u00fchrlich in den folgenden Themen behandeln:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Erfassung von Spannungspegeln \u00fcber Zeitmessung<\/li>\n\n\n\n<li>Einsatz eines Analog-Digital-Konverters zur pr\u00e4zisen Erfassung analoger Messwerte<\/li>\n\n\n\n<li>grafische Darstellung von Spannungspegeln in der Thonny Shell<\/li>\n\n\n\n<li>Aufbau und Test eines computergesteuerten Digitalvoltmeters mit Python<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Damit werden dann auch Anweisungen und Befehle klar, die in fr\u00fcheren Beispielen bereits erforderlich waren, aber noch nicht im Detail diskutiert wurden.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">F\u00fcr Minimalisten: <br>Spannungspegel \u00fcber Zeitmessung erfassen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mithilfe der digitalen Port-Pins lassen sich bereits mit minimalem zus\u00e4tzlichen Hardware-Aufwand einfache Messaufgaben erledigen. Im Folgenden wird ein Python-Programm vorgestellt, das eine einfache Temperaturmessung ausf\u00fchrt, ohne dass daf\u00fcr ein spezieller Analog-Digital-Konverter (ADC) erforderlich w\u00e4re. Dazu kommt ein temperaturabh\u00e4ngiger Widerstand zum Einsatz. Dieser sogenannte NTC 10k hat bei 25&nbsp;\u00b0C einen Widerstandswert von 10&nbsp;k\u2126. Bei h\u00f6heren Temperaturen nimmt dieser Widerstand ab, bei geringeren zu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr das Laden bzw. Entladen eines Kondensators \u00fcber diesen Widerstand werden also je nach Umgebungstemperatur unterschiedliche Zeiten ben\u00f6tigt. Diese Zeiten kann der Raspberry&nbsp;Pi problemlos und exakt messen. Ein passender Hardware-Aufbau ist in <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild&nbsp;1 <\/mark>dargestellt. Als Bauelemente k\u00f6nnen entweder Einzelkomponenten <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">(wie in Bild&nbsp;1)<\/mark> oder Module aus den PAD-Sets verwendet werden<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\"> (Bild&nbsp;2)<\/mark>.<\/p>\n\n\n\n<div class=\"wp-block-columns are-vertically-aligned-bottom is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"975\" height=\"1173\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild1_Python5.jpg\" alt=\"Temperaturmessung ohne ADC\" class=\"wp-image-6493\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild1_Python5.jpg 975w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild1_Python5-249x300.jpg 249w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild1_Python5-768x924.jpg 768w\" sizes=\"auto, (max-width: 975px) 100vw, 975px\" \/><figcaption class=\"wp-element-caption\">Bild 1: Temperaturmessung ohne ADC<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:57%\">\n<figure class=\"wp-block-image size-large is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"1325\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild9_Python5-1600x1325.jpg\" alt=\"Aufbau Bild 1 mit PAD-Set\" class=\"wp-image-6501\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild9_Python5-1600x1325.jpg 1600w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild9_Python5-300x249.jpg 300w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild9_Python5-768x636.jpg 768w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild9_Python5-1536x1272.jpg 1536w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild9_Python5.jpg 1655w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-element-caption\">Bild 2: Aufbau Bild 1 mit PAD-Set<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p class=\"has-gray-lightest-100-background-color has-background wp-block-paragraph\"><strong>Wichtig:<\/strong> Damit der Raspberry keinen Schaden nimmt, sollte der Kondensator immer entladen werden, bevor er in die Schaltung eingesetzt wird. Das kann erreicht werden, indem man die beiden Anschl\u00fcsse des Elkos kurzzeitig miteinander verbindet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im zugeh\u00f6rigen Python-Programm wird ein Pin als Output deklariert und auf HIGH, d.&nbsp;h. auf 3,3&nbsp;V geschaltet. Dann wird der Kondensator geladen. Sobald eine bestimmte Ladespannung erreicht wird, erkennt ein als Eingang definierter Pin ebenfalls einen HIGH-Pegel. Die Zeit bis zum Erreichen dieses Pegels wird gemessen und dient als Ma\u00df f\u00fcr die Temperatur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00dcber zwei Parameter \u2013 <code>cal <\/code>und <code>offset <\/code>\u2013 wird aus der gemessenen Zeit eine Temperatur errechnet. Falls die angezeigte Temperatur nicht mit der wirklichen Umgebungstemperatur \u00fcbereinstimmt, kann man die beiden Parameter entsprechend anpassen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der NTC-Thermistor und der Kondensator bilden ein RC-Glied (Widerstand-Kondensator-Netzwerk). Die Entladezeit des Kondensators h\u00e4ngt vom Widerstand des NTC-Thermistors ab, der wiederum temperaturabh\u00e4ngig ist. Durch Messen der Entladezeit kann auf die Temperatur geschlossen werden, da der Widerstand des NTC-Thermistors mit der Temperatur variiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Kalibrierungsfaktor und der Offset m\u00fcssen experimentell bestimmt werden, um genaue Temperaturwerte zu erhalten (s. u.). Die vorgegebenen Werte sollten aber einen brauchbaren Startwert liefern. Dieses Programm (NTC_RC.py) nutzt also eine Zeitmessung, um die analoge Spannung an einem Kondensator zu \u00fcberwachen und daraus eine Temperatur abzuleiten.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-background-color has-background\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code># Pin Config: activePort-NTC 10k-readout Port-10uF-GND\n\nimport RPi.GPIO as GPIO\nimport time\n\nGPIO.setwarnings(False)\nGPIO.setmode(GPIO.BCM)\n\nactivePort = 8\nreadoutPort = 7\ncal = 1000.0\noffset = 100.0\n\nGPIO.setup(activePort, GPIO.OUT)\nGPIO.setup(readoutPort, GPIO.IN)\n\nwhile(True):\n    GPIO.output(activePort, 1)\n    time.sleep(1)\n    GPIO.output(activePort, 0)\n    tStart = time.time()\n    while GPIO.input(readoutPort) &gt; 0:\n        pass\n    tStop = time.time()\n    T = int(offset-((tStop-tStart)*cal))\n    print(T)\n    time.sleep(1)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Im Programm wird zun\u00e4chst die Pin-Konfiguration festgelegt:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>activePort (Pin 8):<\/strong><br>Dieser Pin wird verwendet, um den Kondensator aufzuladen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>readoutPort (Pin 7):<\/strong><br>Dieser Pin misst den Spannungspegel am Kondensator<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Variablen <strong>cal<\/strong> und <strong>offset<\/strong> dienen als Kalibrierfaktoren: <strong>cal<\/strong> sorgt f\u00fcr die Umrechnung der gemessenen Zeit in eine Temperatur, <strong>offset<\/strong> dient zur Anpassung des Temperaturstartpunkts. Im Setup werden zun\u00e4chst GPIO-Warnungen unterdr\u00fcckt. Dann wird der GPIO-Modus auf BCM (Broadcom Channels) gesetzt. Im Pin-Setup wird \u00fcber <code>GPIO.setup(activePort, GPIO.OUT)<\/code> der \u201eactivePort\u201c als Ausgang festgelegt. \u00dcber <code>GPIO.setup(readoutPort, GPIO.IN)<\/code> wird der <code>readoutPort<\/code> als Eingang definiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In der Hauptschleife wird der Kondensator aufgeladen, indem <code>activePort<\/code> auf HIGH gesetzt wird. Mit <code>time.sleep(1)<\/code> wird eine Sekunde gewartet, damit der Kondensator sicher vollst\u00e4ndig aufgeladen wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann wird der <code>activePort<\/code> auf LOW geschaltet, um das Entladen des Kondensators zu starten. Die Anweisung <code>tStart = time.time()<\/code> speichert den aktuellen Zeitpunkt als Startzeit. Die Anweisung <code>while GPIO.input(readoutPort) &gt; 0<\/code> wartet, bis der Spannungspegel am readoutPort auf LOW f\u00e4llt. Dies ist der Fall, wenn der Kondensator weitgehend entladen ist. Die Variable <code>tStop = time.time()<\/code> speichert diesen Zeitpunkt als Stoppzeit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann wird \u00fcber <code>T = int(offset - ((tStop - tStart) * cal))<\/code> die Temperatur basierend auf der Zeit, die der Kondensator zum Entladen ben\u00f6tigt hat, berechnet und \u00fcber <code>print(T)<\/code> ausgegeben. Mit <code>time.sleep(1)<\/code> wird eine Sekunde bis zur n\u00e4chsten Messung gewartet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild 3<\/mark> zeigt den Signalverlauf an den beiden Pins.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-bordered\" style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"520\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild6_Python5.jpg\" alt=\"Signalverlauf an den Ports\" class=\"wp-image-6498\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild6_Python5.jpg 1000w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild6_Python5-300x156.jpg 300w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild6_Python5-768x399.jpg 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption class=\"wp-element-caption\">Bild 3: Signalverlauf an den Ports<\/figcaption><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Mit den voreingestellten Parametern wird zun\u00e4chst ein Wert ausgegeben, der meist relativ stark von der tats\u00e4chlichen Umgebungstemperatur abweicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Man sollte zun\u00e4chst den Offset-Parameter ver\u00e4ndern, um die aktuelle Temperatur (z. B. von einem Vergleichsthermometer) einzustellen. Dann wird der Sensor erw\u00e4rmt, z. B. durch vorsichtiges Anblasen mit einem F\u00f6n. Ist die Temperatur am Vergleichsthermometer um ca. 10 \u00b0C angestiegen, sollte auch die Temperaturanzeige des NTC-Thermometers h\u00f6her liegen. Vorhandene Unterschiede kann man nun mit dem calParameter korrigieren. Gegebenenfalls muss nun auch der Offset nochmals nachgestellt werden. Dieses Verfahren wird als iterative Kalibrierung bezeichnet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mathematisch versierte Anwender k\u00f6nnen <code>cal<\/code> und <code>offset<\/code> auch berechnen. Hierf\u00fcr werden zwei feste Temperaturniveaus ben\u00f6tigt, z. B. Eiswasser (0&nbsp;\u00b0C) und kochendes Wasser (100&nbsp;\u00b0C). Dann werden die Anzeigewerte des NTC-Thermometers bei beiden Werten gemessen. Nun kann man zwei Gleichungen mit zwei Unbekannten aufstellen, deren L\u00f6sung die Werte <code>cal<\/code> und <code>offset<\/code> liefern.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00e4zise Erfassung analoger Messwerte<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wie in den letzten Abschnitten gezeigt wurde, kann man zwar mit einigen Tricks auch mit GPIO-Ports direkt analoge Werte erfassen. Allerdings ist das meist nur eine Notl\u00f6sung. F\u00fcr pr\u00e4zise Messungen sind andere Verfahren erforderlich.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Will man analoge Spannungswerte zuverl\u00e4ssig und pr\u00e4zise messen, ist der Einsatz eines Analog-Digital-Converters (ADC) das Mittel der Wahl. ADCs werden \u00fcber spezielle Bus-Systeme mit einem Prozessor oder Controller verbunden. Auch beim Raspberry Pi verf\u00fcgen einige der GPIO-Pins \u00fcber eine alternative Funktionalit\u00e4t. Diese erm\u00f6glicht es, z. B. \u00fcber einen I2C-Bus oder \u00fcber SPI mit externen Komponenten zu kommunizieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Viele ADCs werden \u00fcber einen SPI-Bus gesteuert. Deshalb soll diese Variante im folgenden Abschnitt n\u00e4her betrachtet werden.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Der ADC am SPI-Bus<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Abk\u00fcrzung SPI steht f\u00fcr Serial Peripherial Interface. Damit wird ein urspr\u00fcnglich von der Firma Motorola entwickeltes Bus-System bezeichnet, das es erlaubt, Daten zwischen integrierten Schaltkreisen auszutauschen. Ein Entwicklungsziel des Bus-Systems war, mit m\u00f6glichst wenigen Leitungen auszukommen. Beim SPI-Bus werden die einzelnen Bausteine \u00fcber ein Master-Slave-Prinzip miteinander verbunden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Bus verf\u00fcgt \u00fcber vier Leitungen, die vom Master zum Slave oder auch zu mehreren Slaves f\u00fchren. Der bekannte und preisg\u00fcnstige Analog-DigitalKonverter DC MCP3002 wird \u00fcber die SPI-Schnittstelle mit dem Raspberry Pi verbunden. Dieser integrierte Baustein verf\u00fcgt \u00fcber zwei unabh\u00e4ngig voneinander arbeitende Eing\u00e4nge, CH0 und CH1. Die Aufl\u00f6sung betr\u00e4gt zehn Bit. Die gesamte Funktionalit\u00e4t des Bausteins wird \u00fcber die vier Leitungen des SPI-Busses gesteuert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die Kommunikation auf dem SPI-Bus m\u00fcssen Daten in beide Richtungen flie\u00dfen. Also sowohl vom Master zum Slave als auch umgekehrt. Dieser Datenaustausch erfolgt \u00fcber zwei getrennte Leitungen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MOSI (Master-Out-Slave-In)<\/li>\n\n\n\n<li>MISO (Master-In-Slave-Out)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr jede Datenrichtung wird jeweils eine Leitung verwendet. Zus\u00e4tzlich wird noch eine <strong>SCLK-Leitung (Serial-Clock)<\/strong> verwendet, die den Bustakt liefert. Die Auswahl der am Bus angeschlossenen Komponenten (Slaves) erfolgt \u00fcber die CS-Leitung <strong>(Chip-Select)<\/strong>. <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild 4 <\/mark>zeigt einen AD-Wandler-Baustein mit SPIInterface. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized is-style-bordered\" style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"338\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild7_Python5.jpg\" alt=\"Der AD-Wandler MCP3002 verf\u00fcgt \u00fcber ein SPI-Interface.\" class=\"wp-image-6499\" style=\"object-fit:cover;width:442px;height:auto\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild7_Python5.jpg 711w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild7_Python5-300x143.jpg 300w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><figcaption class=\"wp-element-caption\">Bild 4: Der AD-Wandler MCP3002 verf\u00fcgt \u00fcber ein SPI-Interface.<\/figcaption><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Der IC verf\u00fcgt \u00fcber die folgenden Pins:<\/p>\n\n\n\n<figure class=\"wp-block-table has-text-small-font-size\"><table class=\"has-fixed-layout\"><tbody><tr><td colspan=\"1\" rowspan=\"1\"><strong>MC 3002<\/strong><\/td><td colspan=\"1\" rowspan=\"1\"><strong>Funktion<\/strong><\/td><td colspan=\"1\" rowspan=\"1\"><strong>Verbinden mit RasPi Pin<\/strong><\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\">Pin 1<\/td><td colspan=\"1\" rowspan=\"1\">Chip-Select, LOW-Aktiv<\/td><td colspan=\"1\" rowspan=\"1\">GPIO 10 &#8211; CE0<\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\">Pin 2<\/td><td colspan=\"1\" rowspan=\"1\">CH0: Analog-Kanal 0<\/td><td colspan=\"1\" rowspan=\"1\">&#8211;<\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\">Pin 3<\/td><td colspan=\"1\" rowspan=\"1\">CH1: Analog-Kanal 1<\/td><td colspan=\"1\" rowspan=\"1\">&#8211;<\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\">Pin 4<\/td><td colspan=\"1\" rowspan=\"1\">Vss (GND)<\/td><td colspan=\"1\" rowspan=\"1\">GND<\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\">Pin 5<\/td><td colspan=\"1\" rowspan=\"1\">MOSI (Din)<\/td><td colspan=\"1\" rowspan=\"1\">GPIO 12 &#8211; MOSI<\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\">Pin 6<\/td><td colspan=\"1\" rowspan=\"1\">MISO (Dout)<\/td><td colspan=\"1\" rowspan=\"1\">GPIO 13 &#8211; MISO<\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\">Pin 7<\/td><td colspan=\"1\" rowspan=\"1\">CLK (Serial Clock)<\/td><td colspan=\"1\" rowspan=\"1\">GPIO 14 &#8211; SCLK<\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\">Pin 8<\/td><td colspan=\"1\" rowspan=\"1\">VDD\/VREF Spannungsversorgung 3,3 V<\/td><td colspan=\"1\" rowspan=\"1\">3V3<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Da der MCP3002 in einem 8-poligen DIL-Geh\u00e4use untergebracht ist, kann er leicht in ein Breadboard eingebaut werden <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">(siehe Bild&nbsp;5)<\/mark>.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Der ADC-Wandler MCP3002<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Aufgrund seines kompakten Geh\u00e4uses und des SPIInterfaces kann der MC3002 sehr einfach mit dem Raspberry Pi verbunden werden. <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild&nbsp;5<\/mark> und <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild&nbsp;6 <\/mark>zeigen das Schaltbild und den Aufbau dazu.<\/p>\n\n\n\n<div class=\"wp-block-columns are-vertically-aligned-bottom is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:35%\">\n<figure class=\"wp-block-image size-full is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"948\" height=\"1182\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild8_Python5.jpg\" alt=\"Schaltbild zum MCP3002 am Raspberry Pi\" class=\"wp-image-6500\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild8_Python5.jpg 948w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild8_Python5-241x300.jpg 241w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild8_Python5-768x958.jpg 768w\" sizes=\"auto, (max-width: 948px) 100vw, 948px\" \/><figcaption class=\"wp-element-caption\">Bild 5: Schaltbild zum MCP3002 am Raspberry Pi<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"927\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild10_Python5-1600x927.jpg\" alt=\"Aufbaubild zur Erfassung von Analogwerten mit dem MCP3002\" class=\"wp-image-6502\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild10_Python5-1600x927.jpg 1600w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild10_Python5-300x174.jpg 300w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild10_Python5-768x445.jpg 768w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild10_Python5-1536x889.jpg 1536w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild10_Python5-2048x1186.jpg 2048w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-element-caption\">Bild 6: Aufbaubild zur Erfassung von Analogwerten mit dem MCP3002<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Die Kommunikation mit dem Chip findet \u00fcber die beiden Leitungen MISO (Dout) und MSO (Din) statt. Die analogen Eing\u00e4nge liegen auf Pin&nbsp;2 und Pin&nbsp;3 und f\u00fchren die Bezeichnung CH0 und CH1. Der Pin VDD\/VREF wird mit 3,3&nbsp;V versorgt, sodass Eingangsspannungen von 0&nbsp;V bis 3,3&nbsp;V direkt gemessen werden k\u00f6nnen. F\u00fcr h\u00f6here Spannungspegel sind geeignete Spannungsteiler vorzuschalten (s. u.).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Aufl\u00f6sung des MCP3002 betr\u00e4gt 10 Bit. Damit k\u00f6nnen <strong>2<sup>10<\/sup> = 1024 verschiedene Spannungswerte<\/strong> erfasst werden. Der <strong>Wertebereich der Digitalausgabe<\/strong> betr\u00e4gt also <strong>0 &#8230; 2<sup>10<\/sup> &#8211; 1 = 0 &#8230; 1023<\/strong>. Bei einer Versorgungs- bzw. Referenzspannung von 3,3&nbsp;V sind somit prinzipiell Spannungs\u00e4nderungen von 3,22&nbsp;mV messbar.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Inbetriebnahme des MCP3002<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Um den MCP3002 in Betrieb nehmen zu k\u00f6nnen, muss zuerst ein SPI-Treiber importiert werden, damit die Kommunikation \u00fcber den SPI-Bus erm\u00f6glicht wird. F\u00fcr die Installation von spidev (SPI devices) sind die folgenden Schritte im Terminal erforderlich:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-background-color has-background\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code>          sudo apt-get install python-setuptools\n          sudo apt-get install python-dev\n          sudo apt-get install git git clone git:\/\/github.com\/doceme\/py-spidev\n          cd py-spidev\/\n          sudo python setup.py install<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Danach muss zudem die config.txt Datei aktualisiert werden:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-background-color has-background\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code>          sudo nano \/boot\/config.txt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Am Ende der Datei ist die Zeile<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-background-color has-background\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code>          dtparam=spi=on<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">einzuf\u00fcgen. Damit ist der Raspberry Pi bereit, \u00fcber den SPI-Bus zu kommunizieren. Das Python-Programm zur Ansteuerung des MC3002 sieht wie folgt aus (MCP3002_ADC.py):<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-background-color has-background\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code>import time, spidev\n\nspi = spidev.SpiDev(0, 0) # device 0, channel 0\nspi.max_speed_hz = 1200000\n\ndef read_adc(adc_ch, vref = 3.3):\n    msg = 0b11\n    reply = spi.xfer2(((msg &lt;&lt; 1) + adc_ch &lt;&lt; 5, 0b0000000])\n    adc = 0\n    for n in reply:\n        adc = (adc &lt;&lt; 8) + n\n    adc = adc &gt;&gt; 1\n    voltage = (vref * adc) \/ 1024\n    return voltage\n\nprint(\"MCP3002\")\nprint(\"============================\\n\")\n\nwhile True:\n    print(\"Ch 0:\", round(read_adc(0), 2), \"V \\t Ch 1:\",\n    round(read_adc(1), 2), \"V\")\n    time.sleep(0.2)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das Python-Programm liest die analogen Spannungswerte beider Kan\u00e4le des MCP3002 \u00fcber die SPI-Schnittstelle aus und zeigt diese auf der Konsole an. Dabei wird die Python-Bibliothek spidev verwendet, um mit dem ADC \u00fcber SPI zu kommunizieren. Die notwendigen Bibliotheken werden in der ersten Programmzeile importiert:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>time<\/strong> f\u00fcr die Zeitsteuerung<\/li>\n\n\n\n<li>und <strong>spidev<\/strong> f\u00fcr die SPI-Kommunikation.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Danach wird die SPI-Schnittstelle konfiguriert. Mit <code>spi = spidev.SpiDev(0, 0)<\/code> wird ein Default-Wert f\u00fcr den SPI-Kanal (0) auf dem ersten Baustein (0) ausgew\u00e4hlt und eine neue SPI-Verbindung mit dem SPI-Bus \u201e0\u201c erstellt. Die maximale \u00dcbertragungsgeschwindigkeit f\u00fcr die SPI-Kommunikation wird \u00fcber<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">          <code>spi.max_speed_hz = 1200000<\/code> auf 1,2 MHz festgelegt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Funktion <code>read_adc(adc_ch, vref=3.3)<\/code> liest den ADC aus und gibt die gemessenen Spannungswerte zur\u00fcck.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>adc_ch:<\/strong> Der Kanal des ADC, von dem gelesen werden soll (0 oder 1).<\/li>\n\n\n\n<li><strong>vref:<\/strong> Die Referenzspannung des ADC, standardm\u00e4\u00dfig auf 3,3 V gesetzt.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Der ADC wird \u00fcber SPI mit einem 2-Bit-Nachrichtentyp (Command) 0b11 konfiguriert, gefolgt vom gew\u00fcnschten Kanal (adc_ch). Innerhalb der Funktion werden die ersten vier Bits der SPI-Nachricht \u201emsg\u201c konfiguriert:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Das erste Bit (Start) ist immer HIGH, um den Start der Nachricht anzugeben.<\/li>\n\n\n\n<li>Das zweite Bit (SGL\/DIFF) wird ebenfalls auf 1 gesetzt, um den Einzelmodus (Single Mode) auszuw\u00e4hlen. Das bedeutet, dass jeweils nur ein einzelner Kanal gemessen wird.<\/li>\n\n\n\n<li>Das dritte Bit (ODD\/SIGN) wird verwendet, um den Kanal auszuw\u00e4hlen, der gelesen werden soll. Es kann entweder 0 oder 1 sein, je nachdem welcher Kanal ausgew\u00e4hlt werden soll.<\/li>\n\n\n\n<li>Das vierte Bit (MSFB) wird auf 0 gesetzt, um anzugeben, dass die \u00dcbertragung mit dem Least Significant Bit (LSB) zuerst erfolgt, was auch als Little-Endian bezeichnet wird. Diese Reihenfolge wird f\u00fcr die meisten Anwendungen verwendet.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Die gelesenen Daten werden in einem 10-Bit-Wert von 0 bis 1023 empfangen, und die Funktion konvertiert diesen Wert in eine Spannungswert mithilfe der angegebenen Referenzspannung (vref).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In der Hauptschleife werden die Spannungswerte auf zwei Dezimalstellen gerundet und zusammen mit den Kanalbezeichnungen \u201eCh 0:\u201c und \u201eCh 1:\u201c ausgegeben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Anweisung time.sleep(0.2) sorgt f\u00fcr eine Verz\u00f6gerung von 0,2&nbsp;Sekunden zwischen den Messungen. Das Programm gibt damit alle 0,2&nbsp;Sekunden die aktuellen Spannungen von Kanal 0 und Kanal 1 des ADC aus. Nach dem Start des Programms k\u00f6nnen die Werte in der Konsole ausgegeben werden<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\"> (Bild&nbsp;7)<\/mark>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ch&nbsp;0 zeigt die aktuellen Werte der Potentiometer-Spanungen. Ch&nbsp;1 zeigt 0&nbsp;Volt an, da dieser Kanal zun\u00e4chst auf GND (0&nbsp;V) gelegt wurde <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">(siehe Bild&nbsp;5)<\/mark>. Bei praktischen Anwendungen k\u00f6nnen nat\u00fcrlich beide Kan\u00e4le simultan verwendet werden.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-bordered\" style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)\"><img loading=\"lazy\" decoding=\"async\" width=\"489\" height=\"305\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild5_Python5.jpg\" alt=\"Ausgabe der ADC-Werte in der Konsole\" class=\"wp-image-6497\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild5_Python5.jpg 489w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild5_Python5-300x187.jpg 300w\" sizes=\"auto, (max-width: 489px) 100vw, 489px\" \/><figcaption class=\"wp-element-caption\">Bild 7: Ausgabe der ADC-Werte in der Konsole<\/figcaption><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Raspberry Pi als Transientenrekorder: <br>Grafische Datenausgabe<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Daten des ADCs k\u00f6nnen auch im Plotter der Thonny IDE ausgegeben werden. Dazu muss man die Ausgabezeile<br>          <code>print(\"Ch 0:\", round(read_adc(0), 2), \"V Ch 1:\", round(read_adc(1), 2), \"V\")<\/code><br>auf rein numerische Werte umstellen:<br>          <code>print(round(read_adc(0), 2), round(read_adc(1)))<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann hat man bereits ein grafisches Datenerfassungssystem vor sich, das in vielen Anwendungsf\u00e4llen nutzbringend eingesetzt werden kann. <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild&nbsp;8<\/mark> zeigt die grafische Ausgabe der beiden Kan\u00e4le. <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild&nbsp;9 <\/mark>zeigt die gleichen Signale auf einem digitalen Oszilloskop.<\/p>\n\n\n\n<div class=\"wp-block-columns are-vertically-aligned-bottom is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:46%\">\n<figure class=\"wp-block-image size-full is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"706\" height=\"393\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild4_Python5.jpg\" alt=\"Grafische Ausgabe der beiden ADC-Kan\u00e4le im Thonny Plotter\" class=\"wp-image-6496\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild4_Python5.jpg 706w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild4_Python5-300x167.jpg 300w\" sizes=\"auto, (max-width: 706px) 100vw, 706px\" \/><figcaption class=\"wp-element-caption\">Bild 8: Grafische Ausgabe der beiden ADC-Kan\u00e4le im Thonny Plotter<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-bottom is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full is-style-bordered\"><img loading=\"lazy\" decoding=\"async\" width=\"1002\" height=\"518\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild3_Python5.jpg\" alt=\"Werte aus Bild 8 auf einem Digitaloszilloskop\" class=\"wp-image-6495\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild3_Python5.jpg 1002w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild3_Python5-300x155.jpg 300w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild3_Python5-768x397.jpg 768w\" sizes=\"auto, (max-width: 1002px) 100vw, 1002px\" \/><figcaption class=\"wp-element-caption\">Bild 9: Die Werte aus Bild 8 auf einem Digitaloszilloskop<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Man erkennt, dass die Werte des Transientenrekorders gut mit den Ausgabedaten des digitalen Speicheroszilloskops (DSO) \u00fcbereinstimmen. Lediglich die Flanken sind in der Thonny-Grafik nicht ganz so steil, da hier nur mit f\u00fcnf Werten pro Sekunde abgetastet wird.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Darf in keinem Labor fehlen: Pr\u00e4zises Computer-Digitalvoltmeter mit Python-Steuerung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dem MCP3002 ist es nun m\u00f6glich, Spannungen sehr pr\u00e4zise zu messen. Allerdings darf die Eingangsspannung an den Analogpins CH0 und CH1 keinesfalls die Versorgungsspannung des A\/D-Wandlers von 3,3&nbsp;V \u00fcberschreiten. M\u00f6chte man gr\u00f6\u00dfere Spannungen messen, muss man einen Spannungsteiler vorschalten. Verwendet man einen Teiler aus einem 100-kOhm- und einem 10-kOhm-Widerstand, so erh\u00e4lt man eine Spannungsreduktion um den F<strong>aktor F = 10&nbsp;kOhm \/ 100&nbsp;kOhm + 10&nbsp;kOhm) = 1\/11<\/strong>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Referenzspannung von 3,3 V liefert als Eingangspegel den Wert von  <strong>2<sup>10<\/sup> &#8211; 1 = 1023<\/strong>.<br>Als Kalibrationskonstante erh\u00e4lt man so <strong>cal = 11 x 3,3 \/ (2<sup>10<\/sup>-1) = 11 x 3,3 \/ 1023 = 0,03548&#8230;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit diesen Konstanten kann der ADC-Wert im Python-Programm direkt in eine Spannung umgerechnet werden. Die Schaltung dazu ist in <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-blue-color\">Bild&nbsp;10<\/mark> zu sehen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized is-style-bordered\" style=\"margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"766\" src=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild2_Python5-1600x766.jpg\" alt=\"Computer-Voltmeter bis max. 30 V\" class=\"wp-image-6494\" style=\"object-fit:cover;width:590px;height:auto\" srcset=\"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild2_Python5-1600x766.jpg 1600w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild2_Python5-300x144.jpg 300w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild2_Python5-768x368.jpg 768w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild2_Python5-1536x736.jpg 1536w, https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Bild2_Python5.jpg 1706w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-element-caption\">Bild 10: Computer-Voltmeter bis max. 30 V<\/figcaption><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Damit ist es nun m\u00f6glich, externe Spannungen mit bis zu 35&nbsp;V zu messen. Vorsichtshalber sollte man aber einen gewissen Sicherheitsabstand zur zul\u00e4ssigen Maximalspannung einhalten. Bis 30&nbsp;V kann man aber mit dem Computer-Voltmeter problemlos und sehr genau messen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die zus\u00e4tzlichen Schottky-Dioden dienen dazu, den A\/D-Wandler vor Verpolung bzw. \u00dcberlastung zu sch\u00fctzen. Wird eine Spannung falsch herum an den Messeingang angelegt, schlie\u00dft die Diode SD2 den Eingang des MCP3002 nahezu kurz. Es k\u00f6nnen dann maximal ca. -0,3&nbsp;V am Eingang des ICs anliegen, sodass dieses keinen Schaden nehmen kann. Die Diode SD2 sch\u00fctzt auf \u00e4hnliche Weise vor zu hohen Spannungen (&gt; Vcc + 0,3&nbsp;V). Nun muss nur noch das Programm entsprechend angepasst werden:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-background-color has-background\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><code># MCP3002_voltmeter.py\n\nfrom Tkinter import *\nimport spidev\nimport time\n\n# SPI setup\nspi_max_speed = 1000000   # 1 MHz for SPI\nCE = 0                    # select SPI device\n\nspi = spidev.SpiDev()\nspi.open(0,CE)\n\nroot=Tk()\nroot.font=('Arial', 30, 'normal')\nroot.title(\"Voltmeter\")\nroot.geometry('280x60') #window size\n\ncal = 11*3.3\/1023\noffset = 0\n\ndef read_mcp3002(lb):\n    cmd = 0b01100000 # CH0\n    # cmd = 0b01110000 # CH1\n    spi_data = spi.xfer2(&#91;cmd,0]) # start sp communication\n    adc_data = ((spi_data&#91;0] &amp; 3) &lt;&lt; 8) + spi_data&#91;1]\n    Voltage = 0.01*int((100*adc_data-offset)*cal)\n    lb.config(text= str(Voltage) + \" V\")\n    # time.sleep(1)\n    lb.after(100, read_mcp3002, lb)\n    # return adc_data\n\nlb = Label(root)\nlb.config(text=\"\", font = root.font)\nlb.pack()\n\nread_mcp3002(lb)\nroot.mainloop()<\/code><\/pre>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware- und Softwarekalibrierung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nach der Inbetriebnahme des Voltmeters sollte am Bildschirm ein bestimmter Spannungswert angezeigt werden. Durch Drehen am Potentiometer l\u00e4sst sich der Wert in gewissen Grenzen ver\u00e4ndern. In einem ersten Schritt wird das Potentiometer so eingestellt, dass die aktuelle Spannung korrekt angezeigt wird. Dieser Abgleich wird als Hardware-Kalibration bezeichnet. Nun kann man das Voltmeter bei anderen Spannungen testen. Falls es zu Messabweichungen kommt, kann man die Parameter <code>cal<\/code> und <code>offset<\/code> so ver\u00e4ndern, dass alle Messwerte mit nur noch minimalen Fehlern angezeigt werden. Dieses Vorgehen ist auch als iterative Methode bekannt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Durch die Anpassung der beiden Parameter <code>cal<\/code> und <code>offset<\/code> wird eine sogenannte Softwarekalibration durchgef\u00fchrt. Wer mathematisch interessiert ist, kann die Parameter wieder aus verschiedenen Messpunkten mittels spezieller Verfahren wie etwa der gau\u00dfschen Fehlerquadratmethode berechnen. Alternativ kann man auch eine sogenannte Ausgleichsgerade durch die Messpunkte legen und dann die beiden Parameter ablesen.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit und Ausblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beitrag wurde die Erfassung analoger Messwerte mit Python ausf\u00fchrlich dargestellt. Neben einer einfachen Ladezeit-Messung kam dabei auch ein SPI-gesteuerter ADC zum Einsatz. Die Werte konnten in Thonny sowohl als numerische Tabelle oder auch als einfache Zeit\/Messwert-Grafiken ausgegeben werden. Diese einfache Form der grafischen Ausgabe ist in vielen F\u00e4llen ausreichend. Allerdings ist Python auch in der Lage, komplexere Grafiken darzustellen. Damit wird es m\u00f6glich, z. B. Messwerte in den verschiedensten Varianten aufzutragen. Neben einfachen x\/y-Grafiken k\u00f6nnen dann auch Balken- oder Streudiagramme erstellt werden. Auch komplexe Signalanalysemethoden sind in Python vergleichsweise leicht programmierbar. Die umfangreiche und weit verbreitete MatplotlibBibliothek stellt dazu eine Vielzahl von Methoden zur Verf\u00fcgung. Sie soll daher im n\u00e4chsten Artikel detailliert betrachtet werden.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Material<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Raspberry Pi mit Netzteil<\/li>\n<\/ul>\n\n\n<div class=\"alignnone wp-block-dhsv-product-teaser\">\n    <div data-component=\"ProductTeaser\" data-props=\"{&quot;productIds&quot;:&quot;251467,158980&quot;,&quot;view&quot;:&quot;list&quot;,&quot;slider&quot;:true,&quot;sliderMobile&quot;:true,&quot;align&quot;:&quot;none&quot;}\"><\/div>\n<\/div>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Sie ben\u00f6tigen au\u00dferdem:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">ein A\/D-Konverter, z. B. MCP3002<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-gray-lightest-100-background-color has-background wp-block-paragraph\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\"><strong>\u00dcber den Autor<br><\/strong>Dr. G\u00fcnter Spanner ist als Autor zu den Themen Elektronik, Sensortechnik und Mikrocontroller einem weiten Fachpublikum bekannt. Schwerpunkt seiner hauptberuflichen T\u00e4tigkeit f\u00fcr verschiedene Gro\u00dfkonzerne wie Siemens und ABB ist die Projektleitung im Bereich Entwicklung und Technologie-Management. Der Dozent fu\u0308r Physik und Elektrotechnik hat zudem zahlreiche Fachartikel und Bu\u0308cher vero\u0308ffentlicht sowie Kurse und Lernpakete erstellt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die reale Welt ist analog \u2013 und Python kann das auch! In diesem Teil unserer Serie zeigen wir Ihnen, wie Sie analoge Werte mit dem Raspberry Pi erfassen: von einfachen Tricks bis hin zum pr\u00e4zisen ADC-Einsatz.<\/p>\n","protected":false},"author":30,"featured_media":864,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[34],"tags":[965,967,963,964,966],"post-author":[137],"class_list":["post-4362","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python-micropython","tag-analoge-messwerte-python","tag-python-voltmeter-bauen","tag-raspberry-pi-adc-mcp3002","tag-spi-bus-raspberry-pi-python","tag-temperaturmessung-ntc-raspberry-pi","post-author-dr-guenter-spanner"],"acf":[],"info":{"thumbnail":{"url":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/header_phyton_teil11.jpg","alt":""},"teaserImage":{"ID":4829,"id":4829,"title":"liste-beitrag_python_t5_neu","filename":"Liste-Beitrag_python_t5_neu.jpg","filesize":96913,"url":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu.jpg","link":"https:\/\/de.elv.com\/elvjournal\/python-einstieg-teil5-analoge-werte\/liste-beitrag_python_t5_neu\/","alt":"","author":"5","description":"","caption":"","name":"liste-beitrag_python_t5_neu","status":"inherit","uploaded_to":4362,"date":"2025-09-29 12:19:25","modified":"2025-09-29 12:22:27","menu_order":0,"mime_type":"image\/jpeg","type":"image","subtype":"jpeg","icon":"https:\/\/elvjournal.elv.com\/wp-includes\/images\/media\/default.png","width":433,"height":274,"sizes":{"thumbnail":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu-250x250.jpg","thumbnail-width":250,"thumbnail-height":250,"medium":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu-300x190.jpg","medium-width":300,"medium-height":190,"medium_large":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu.jpg","medium_large-width":433,"medium_large-height":274,"large":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu.jpg","large-width":433,"large-height":274,"1536x1536":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu.jpg","1536x1536-width":433,"1536x1536-height":274,"2048x2048":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu.jpg","2048x2048-width":433,"2048x2048-height":274,"gform-image-choice-sm":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu.jpg","gform-image-choice-sm-width":300,"gform-image-choice-sm-height":190,"gform-image-choice-md":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu.jpg","gform-image-choice-md-width":400,"gform-image-choice-md-height":253,"gform-image-choice-lg":"https:\/\/elvjournal.elv.com\/wp-content\/uploads\/Liste-Beitrag_python_t5_neu.jpg","gform-image-choice-lg-width":433,"gform-image-choice-lg-height":274}},"categories":[{"id":34,"name":"Python &amp; MicroPython","slug":"python-micropython"}],"authors":[{"id":137,"name":"Dr. G\u00fcnter Spanner","slug":"dr-guenter-spanner"}],"document":false,"epaper":"","date":"23. Februar 2026","excerpt":"Die reale Welt ist analog \u2013 und Python kann das auch! In diesem Teil unserer Serie zeigen wir Ihnen, wie Sie analoge Werte mit dem Raspberry Pi erfassen: von einfachen Tricks bis hin zum pr\u00e4zisen ADC-Einsatz."},"_links":{"self":[{"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts\/4362","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/users\/30"}],"replies":[{"embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/comments?post=4362"}],"version-history":[{"count":10,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts\/4362\/revisions"}],"predecessor-version":[{"id":14192,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/posts\/4362\/revisions\/14192"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/media\/864"}],"wp:attachment":[{"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/media?parent=4362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/categories?post=4362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/tags?post=4362"},{"taxonomy":"post-author","embeddable":true,"href":"https:\/\/de.elv.com\/elvjournal\/wp-json\/wp\/v2\/post-author?post=4362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}