MCP3008 Analoge Werte am Raspberry Pi Messen

Mit dem Raspberry Pi haben wir ein mächtigen Computer und können mit den GPIO-Pins einfach auf die Umwelt zugreifen und dort Daten lesen. Wir haben aber ein Problem, nämlich dass wir nur digitale Daten lesen können. Digitale Daten sind dabei nur eine 0 oder 1. Heißt, wenn wir mit Sensoren arbeiten, einen hohen oder einen niedrigen Strom haben. Ein Beispiel ist dabei ein Taster. Wenn Strom fließt, messen wir eine 1 und wenn kein Strom fließt, messen wir eine 0. Andere Sensoren übermitteln aber analoge Werte. Diese befinden sich zwischen 0 und 1. Um diese auszulesen, wird ein ADC gebraucht. Ein Analog zu Digital Konverter. Mit dem MCP3008 haben wir genau so ein Gerät. Über SPI können wir es an den Raspberry Pi anschließen und haben dann die Möglichkeit bis zu acht analoge Anschlüsse auszulesen.

Schaltplan eines MCP3008 ADC

Die untere Seite erkennst du an der halbrunden Anordnung. CH0 – CH7 sind die analogen Eingänge, die wir benutzen werden.

  • VDD: Spannung, die der MCP3008 für den Betrieb braucht
  • V_REF: Ist die höchste Spannung, welche die analogen Anschlüsse bekommen. Diese werden gebraucht, um richtige Werte zu messen
  • AGND: Masse für die analogen Anschlüsse
  • CLK: Abkürzung für Clock (Uhr). Koordiniert die Geschwindigkeitszeit
  • D_OUT: Ausgang zur SPI Schnittstelle am Raspberry Pi
  • D_IN: Eingang zur SPI Schnittstelle am Raspberry Pi
  • CS/SHDN: Abkürzung für Chip Select. Mit dem SPI lassen sich verschiedene Geräte gleichzeitig ansteuern
  • DGND: Masse für den MCP3008

Wie gesagt, brauchen wir SPI. Wenn du das noch nicht aktiviert hast, gibt es hier eine Anleitung dafür:

SPI aktivieren: http://cw42.de/spi

Nachdem wir die Software Grundlagen hinter uns haben, geht es darum, die Hardware richtig anzuschließen.

MCP3008 an den Raspberry Pi angeschlossen

Die halbrunde Nase zeigt in diesem Fall nach unten. Stecke den MCP3008 am besten über den mittleren Kanal des Breadboards, also zwischen e und f.

Anschlüsse Raspberry PiAnschlüsse MCP3008
GNDDGND
GPIO 8NCS/SHD
GPIO 10D_IN
GPIO 9D_OUT
GPIO 11CLK
GNDAGND
V_REF3,3V
VDD3,3V
nano mcp.py
#!/usr/bin/python
import spidev
import time
import os
import RPi.GPIO as gpio

# SPI Verbindung herstellen
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz=1000000

# Liest Daten vom MCP3008
def analogEingang(channel):
  adc = spi.xfer2([1,(8+channel)<<4,0])
  data = ((adc[1]&3) << 8) + adc[2]
  return data

while True:
  print("0: "+str(analogEingang(0)))
  print("1: "+str(analogEingang(1)))
  print("2: "+str(analogEingang(2)))
  print("3: "+str(analogEingang(3)))
  print("4: "+str(analogEingang(4)))
  print("5: "+str(analogEingang(5)))
  print("6: "+str(analogEingang(6)))
  time.sleep(0.2)

Jetzt musst du nur noch das Programm ausführen:

python3 mcp.py

Wenn jetzt keine Werte ausgegeben werden, sollte dich das nicht wundern, denn du hast ja auch noch nichts angeschlossen, was sinnvolle Werte ausgeben könnte 😉

Also schnell weiter zum ersten Sensor!