Raspberry Pi MCP3008 ADC

Arduino, GPIO

MCP3008: Am Raspberry Pi analoge Signale auslesen

Viele der ursprünglich für den Arduino entwickelten Sensoren bieten keine digitale Schnittstelle und sind nur analog auslesbar. Das Problem dabei besteht, dass der Raspberry Pi mit seinen GPIOs keine analogen Signale auslesen kann, weshalb man einen Analog-Digital Converter (ADC) wie den MCP3008 benötigt. Damit können bis zu 8 analoge Eingänge über den SPI Bus am Raspberry Pi ausgelesen werden.

In diesem Artikel gibt es eine Erklärung sowie eine Python Klasse, womit die Signale aller analogen Sensoren und Module ausgelesen werden können.



Eine Möglichkeit besteht natürlich darin einen Arduino mit dem Raspberry Pi zu verbinden, da dieser auch analoge IO Pins hat und somit ohne ADC jene Signale auslesen kann. Wie das funktioniert ist ausführlich im verlinkten Tutorial beschrieben. Der Nachteil darin besteht allerdings darin, dass man zum einen noch einen weiteren Mikrocontroller hat und dass dieser nicht über Python ansprechbar ist. Da Python sich vor allem als Einsteiger Programmiersprache eignet, nutzen auch die meisten Tutorials dieser Seite Python. Ein Arduino hingegen wird mit C++ programmiert.

 

Mögliches Zubehör

Neben dem MCP3008 ADC solltest du noch Jumper Kabel und ein Breadboard haben.

 

Darüber hinaus gibt es sehr viele Sensoren bzw. Module, welche nur analog augelesen werden können, wie z.B.:

Zu den meisten dieser Module findest du auf dieser Website auch ausführlichere Anleitungen und/oder Projekte, welche diese verwenden. Wenn du diesem Tutorial folgst wirst du allerdings auch jeden anderen analogen Sensor / Modul auslesen können.

 

Unterschiede zwischen Analog und Digital

Bei digitalen Signalen gibt es immer nur zwei Zustände: AN/HIGH oder AUS/LOW (1 oder 0). Wenn man von einer maximalen digitalen Eingangsspannung von 5V ausgeht so würde jeder Wert zwischen 0V und 0.4V als LOW Pegel erkannt und ein Wert zwischen 2.4V und 5V als HIGH Pegel. Alle Werte dazwischen sind undefiniert. Legt man eine solche Spannung an würde das Signal zufällig als 0 oder 1 erkannt werden. Da das aber nicht konsistent ist, sollte ein digitales Signal nie in dieser Grauzone liegen.

Im Gegensatz zu digitalen Signalen kann ein analoges Signal auch Zwischenwerte annehmen, es ist also nicht eindeutig definiert. So können z.B. prozentuale Werte angegeben werden (Wert ÷ anliegende Spannung), was viele analoge Sensoren ausnutzen.
Um diese Spannung am Raspberry Pi auslesen zu können, muss ein Analog-Digial Wandler wie der MCP3008 verwendet werden. Dieser gibt jedoch keine Werte in Volt an, sondern eine Zahl zwischen 0 und 1023, was 10 Bit entspricht (2^10). Dabei kann man die Spannung wie folgt feststellen:

(ADC Wert ÷ 1023) * Spannung

Wird der analoge Sensor mit einer Spannung von 3.3V betrieben und ein Wert von 789 wurde ausgelesen, so entspricht die anliegende Spannung 2.54 Volt.

 

 

Verbindung zwischen Raspberry Pi und MCP3008

Raspberry Pi MCP3008 Pinout

Auf der linken Seite des MCP3008 befinden sich die 8 analog auslesbaren Kanälen.

Die einfachste Methode einen Analog-Digital Konverter anzusprechen ist den SPI Bus zu verwenden. Hierbei können alle 8 anliegenden Signale mit einer Abfrage ausgelesen werden und umgewandelt werden können.

Wie im Datenblatt zu sehen ist, verträgt der ADC eine Eingangsspannung zwischen 2.7V und 5V. Da die GPIOs mit 3.3V arbeiten und bei höherer Spannung kaputt gehen könnten, sollte der MCP3008 auch nur mit 3.3V betrieben werden. Solltest du ein analoges Modul verwenden, welches eine höhere Eingangsspannung als 3.3V hat (und diese auch weitergeben kann) musst du unbedingt sichergehen, dass diese den ADC nicht erreichen. Dafür können z.B. Vorwiderstände verwendet werden und dies ggf. im weiteren Verlauf (Berechnungen etc.) beachtet werden.

Die Verbindung zum Raspberry Pi ist recht einfach, da nur jene GPIOs verwendet werden, welche auch für den SPI Bus sind:

RaspberryPiMCP3008
Pin 1 (3.3V)Pin 16 (VDD)
Pin 1 (3.3V)Pin 15 (VREF)
Pin 6 (GND)Pin 14 (AGND)
Pin 23 (SCLK)Pin 13 (CLK)
Pin 21 (MISO)Pin 12 (DOUT)
Pin 19 (MOSI)Pin 11 (DIN)
Pin 24 (CE0)Pin 10 (CS/SHDN)
Pin 6 (GND)Pin 9 (DGND)

 

Schematisch sieht die Verbindung dann wie folgt aus, wobei ich explizit keinen Sensor auf die rechte Seite gestellt habe, da alle digitalen Signale so ausgelesen werden können:

Raspberry Pi MCP3008 ADC Anschluss

 

Vorbereitung

Bevor die Werte nun ausgelesen werden können, müssen die Packetquellen aktualisiert werden und eine Bibliothek für SPI installiert werden und natürlich der SPI Bus aktiviert werden, da dieser standardmäßig in Raspbian deaktiviert ist.

Fangen wir damit an die Pakete zu aktualisieren und die Python Developer-Tools zu installieren:

sudo apt-get update 
sudo apt-get upgrade
sudo apt-get install python-dev

Anschließend können wir die SpiDev Bibliothek herunterladen, entpacken und installieren:

wget https://github.com/doceme/py-spidev/archive/master.zip 
unzip master.zip
cd py-spidev-master
sudo python setup.py install

Zu guter Letzt muss der SPI Bus noch aktiviert werden, falls noch nicht geschehen. In Raspbian Jessie (und anderen darauf basierenden Betriebssystemen) kann mittels sudo raspi-config die Konfiguration des Raspberry Pi’s verändert werden. Unter dem Punkt „Advanced Options“ findet sich die Option „SPI“. Dort aktivierst du SPI und startest anschließend das System neu (falls keine entsprechende Abfrage kommt: sudo reboot).

 

 

Python Klasse für den Raspberry Pi ADC MCP3008

Die folgende Klasse ermöglicht er dir einfach auf den MCP3008 ADC zuzugreifen. Entweder kannst du die Datei dazu hier downloaden oder mittels sudo nano MCP3008.py erstellen und folgenden Code einfügen:

 

Du kannst diese Datei nun in alle deine Projekt Ordner einfügen und einfach einbinden:

Anschließend muss die Klasse einmal initialisiert werden und die 8 analogen Channels können ausgelesen werden:

Nun sollte nichts mehr im Wege stehen alle möglichen Arduino / Genuino Module auch am Raspberry Pi zu betreiben.



, , , , , , , ,


14 Kommentare

  1. Andreé sagt:

    Hallo Felix,
    Danke für den sehr guten Artikel, sehr gut nachvollziehbar, Gruß André.

  2. Ink Rós sagt:

    Sehr schönes tutorial,
    Frage zu: „… so würde jeder Wert zwischen 0V und 0.4V als LOW Pegel erkannt und ein Wert zwischen 2.4V und 5V als HIGH Pegel.“
    Wieso denn 0.4V ?? Gruß und Danke

  3. Berthold sagt:

    Hallo,
    es wäre schön, wenn man auch noch einen Schaltplan dazu machen könnte, damit man das besser versteht. Aber sonst ist alles sehr gut erklärt. Übrigens der Link zum Datenblatt funktioniert nicht.

    Gruss
    Berthold

  4. Leser sagt:

    Warum wird hier nicht das GPIOZERO verwendet. Finde ich am einfachsten.
    Ist im Magpi Juli auch gut erklärt.

  5. Jens sagt:

    Sehr schön gemacht. DANKE!

  6. olli sagt:

    Hallo
    kann ich damit alle spi sensoren ansprechen?
    Bin neu kenne mich net so aus mit Rasberrypi
    Vielen Dank

    • Felix sagt:

      Hallo Olli,
      Für SPI Sensoren brauchst du den MCP3008 nicht, da SPI bereits digitale Signale liefert. Allerdings habe ich bereits einige Tutorials mit SPI Sensoren gemacht 🙂

  7. Hauschi sagt:

    Hi felix,
    man kann ja 2 spi „geräte“ ansteuern???

    wenn ich den mcp3008 an ce1 also gpio7 anschließe, muss ich dann nur bus=1 und device=1 ändern

    Hauschi

  8. ELHASSAN ELDALKAM sagt:

    can i see the graph ?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!