Schaltungen
  • Registrieren

Beitragsseiten

Der MCP3008 ist ein 8 Kanal Analog / Digital Wandler mit einer Auflösung von 10 Bit, welcher mit einer SPI-Schnittstelle ausgestattet ist. Was liegt also näher, die SPI-Schnittstelle unseres Raspberry Pi zu nutzen und damit seine Möglichkeiten um die Wahrnehmung analoger Daten zu erweitern. Das das überhaupt nicht schwierig ist, werden wir in folgender Anleitung erkennen. Der Auto des Buches "Durchstarten mit dem Raspberry Pi", Erik Bartmann, hat uns freundlicherweise seine Pythonscripte und Anleitungen zur Verfügung gestellt, die ab sofort in der Downloadsektion zindensind. Die Scripte funktionieren sowohl mit dem hier vorgestelltem Schaltungsaufbau als auch mit dem von Erik Bartmann.


Anschlussbelegung des MCP3008

Dazu schauen wir uns zunächst mal die Pinbelegung des MCP3008 an

Pinbelegung MCP3008

Auf den ersten Blick fällt auf, dass die Anschlüsse sehr gut geordnet sind. Wir finden alle 8 analogen Eingangskanäle auf der linken Seite, Stromversorgungs und Schnittstellenanschlüsse auf der rechten. Also nicht nur ideal, um ihn auf eine Experimentierplatine zu stecken, sondern auch gut für die Enwicklung einfacher Leiterplatten für feste Anwendungen. Wir wollen schnell zu einem Ergebnis kommen und sparen uns die theoretischen und technischen Einzelheiten über die Funktionsweise des Schaltkreises. Dafür gibt es das Datenblatt. Die Funktionen der einzelnen Pins sollten wir jedoch kennen:

  • VDD ist die Versorgungsspannung des Schaltkreises. Sie liegt zwischen 2,7 und 5,5V, alles was über 7V geht zerstört den Schaltkreis.
  • VREF ist eine Referenzspannung die benötigt wird, um die Spannung an den analogen Anschlüssen zu vergleichen und so einen digitalen Wert zu berechnen. Sie sollte nicht höher als die Versorgungsspannung sein.
  • AGND ist die Masse für den analogen Teil des Schaltkreises.
  • CLK bestimmt den Takt für die Datenübertragung (engl.: clock).
  • DOUT ist der digitale Ausgang der SPI-Schnittstelle.
  • DIN ist der digitale Eingang der SPI-Schnittstelle.
  • CS/SHDN ist der Steuereingang des Schaltkreises (eng.: cable select). Wird er auf low gesetzt ist der Schaltkreis aktiv.
  • DGND ist die Masse des digitalen Teils des Schaltkreises.
  • CH1...7 sind die 8 analogen Eingangskanäle. Sie können mit einer Spannung belegt werden, die mit einer Referenzspannung (VREF) verglichen und dann in einer Auflösung von 1024 (10 Bit Auflösung, 210 = 1024) an die SPI-Schnittstelle übergeben wird. Die Spannung an den Eingängen darf laut Datenblatt -0,6V bis VDD+0,6V nicht unter- / überschreiten, da der Schaltkreis sonst Schaden nimmt.

Schaltungsaufbau

Um die Grundfunktionen des Schaltkreises zu nutzen, benötigen wir eine Schaltung, die an einem Analogeingang eine Spannung, am besten einstellbar zur Verfügung stellt. Was fällt uns dazu ein? Genau ein Spannungsteiler, am besten ein einstellbarer also ein Potentiometer. Dazu noch ein paar Kabelbrücken und Verbindungskabel zum Raspberry Pi und schon kanns losgehen.

Schaltung MCP3008 mit Poti

Wir verbinden VDD und VREF mit dem positiven Pol (+) der Spannungsschiene des Experimentierboards.

Die digitale und analoge Masse schließen wir an Masse (-) der Platine an.

Das Potentiometer wird an den beiden äußeren Anschlüssen jeweils an Masse (-) und + der Spannungsschiene gelegt. Der Mittelanschluss des Potis kommt an den Eingang CH0 des Schaltkreises.

Jetzt verbinden wir den Raspberry Pi mit der Schaltung. Dazu schließen wir Pin 22 (GPIO 25) an CS, Pin18 (GPIO 24) an DIN, Pin 16 (GPIO 23) an DOUT und Pin 12 (GPIO 18) an CLK an.

Zu guter Letzt versorgen wir die Schaltung mit Spannung. Wir nehmen die 3,5V vom Pin1 und verbinden diese mit dem Pluspol (+) der Spannungsschiene und als Masse nehmen wir den Pin 6 und verbinden diesen mit dem Minuspol (-) auf der Experimentierplatine.

Der Raspberry Pi war natürlich bei der ganzen Sache aus. Also fahren wir ihn nun hoch. Noch liegt die Schaltung ganz ruhig vor uns.


Pythonscript

Um Werte auszulesen, kommen wir um etwas Programmierarbeit nicht herum. Es gibt ab jetzt viele Möglichkeiten, aber da die Raspberry Pi Foundation Python als bevorzugte Sprache für den Raspberry erkoren hat, wollen wir diese auch nutzen. Diese Anleitung soll kein Einstieg in die Programmierung darstellen. Anwender, die jetzt nicht unbedingt das Programmieren mit Python erlernen wollen ignorieren die Erläuterungen einfach und führen nur die notwendigen Schritte aus bzw. nutzen dann einfach das fertige Programm zum Testen.

Theoretisch könnten wir nun beginnen die Ansteuereung für die GPIOs von Grund auf zu programmieren. Aber da dies schon viele andere gemacht haben, nutzen wir das mal aus und installieren die Python-Programmbibliothek (eng.: Library) für die Nutzung der GPIOs. Falls noch nicht geschehen gehen wir dazu nach der Anleitung für die Installation der Python GPIO Library vor.

Haben wir das getan, können wir mit einem relativ einfachen Pythonscript unseren Testaufbau abfragen. Python soll wie gesagt nicht das Thema sein. Trotzdem hier der Quelltext, der im Aufbau dem Script read_mcp3008.py aus der Sammlung Erik Bartmanns entspricht:

#Python Timerklasse importieren
import time
#Python Raspberry Pi GPIO Klasse importieren
import RPi.GPIO as GPIO

# Festlegung der Nutzung der vorgegebenen Nummerierung der GPIOs
GPIO.setmode(GPIO.BCM)

# Namen von True und False zum besseren Verständnis festlegen (Klarnamen)
HIGH = True  # 3,3V Pegel (high)
LOW  = False # 0V Pegel (low)

# SCI Funktion
def getAnalogData(adCh, CLKPin, DINPin, DOUTPin, CSPin):
    # Pegel definieren
    GPIO.output(CSPin,   HIGH)    
    GPIO.output(CSPin,   LOW)
    GPIO.output(CLKPin, LOW)
        
    cmd = adCh
    cmd |= 0b00011000 # Kommando zum Abruf der Analogwerte des Datenkanals adCh

    # Bitfolge senden
    for i in range(5):
        if (cmd & 0x10): # 4. Bit prüfen und mit 0 anfangen
            GPIO.output(DINPin, HIGH)
        else:
            GPIO.output(DINPin, LOW)
        # Clocksignal negative Flanke erzeugen   
        GPIO.output(CLKPin, HIGH)
        GPIO.output(CLKPin, LOW)
        cmd <<= 1 # Bitfolge eine Position nach links verschieben
            
    # Datenabruf
    adchvalue = 0 # Wert auf 0 zurücksetzen
    for i in range(11):
        GPIO.output(CLKPin, HIGH)
        GPIO.output(CLKPin, LOW)
        adchvalue <<= 1 # 1 Postition nach links schieben
        if(GPIO.input(DOUTPin)):
            adchvalue |= 0x01
    time.sleep(0.5)
    return adchvalue

# Konfiguration Eingangskanal und GPIOs
CH = 0  # Analog/Digital-Channel
CLK     = 18 # Clock
DIN     = 24 # Digital in
DOUT    = 23  # Digital out
CS      = 25  # Chip-Select

# Pin-Programmierung
GPIO.setup(CLK, GPIO.OUT)
GPIO.setup(DIN, GPIO.OUT)
GPIO.setup(DOUT, GPIO.IN)
GPIO.setup(CS,   GPIO.OUT)

while True:
    print getAnalogData(CH, CLK, DIN, DOUT, CS)

Werte auslesen

Zum Auslesen der Werte müssen wir nun unser Pythonscript starten. Um es auf den Raspberry Pi zu bekommen könnten wir es abtippen und speichern. Einfacher ist jedoch der download des fertigen Scriptes aus der Scriptsammlung von Erik Bartmann. Die Sammlung findet Ihr in der Downloadsektion unter Experimente zu finden. Den Speicherort sollten wir uns merken. Jetzt suchen wir den Ordner in dem die Datei gespeichert ist mit dem Dateimanager. Mit einem Rechtsklick auf den Ordner kommen wir mit dem Menüpunkt "Im Terminal öffnen" direkt in ein neu geöffnetes Terminal und sind sofort bereit, das Script dort auszuführen. Dies tun wir mit:

python mcp3008_lesen.py

Das Script sollte nun laufen. Es könnte den ein oder anderen Hinweis geben, dass bestimmte GPIOs bereits genutzt werden. Das liegt daran, dass wir unter Umständen schon andere Experimente durchgeführt haben und die Pins nicht freigegeben sind. Das Script übersteuert dies jedoch und wir sollten eine Folge von Werten sehen, die sich beim drehen des Potis ändert. Idealtypisch können wir den Wert nun mit dem Poti von 0 bis 1023 regeln. So könnte es aussehen:

0
0
0
50
57103
268
551
1023
712
305
71
0
0
...

Ich habe das Poti also mehr oder weniger schnell hin und her gedreht. Tolle Sache, aber der Raspberry Pi läuft und läuft und läuft und ...

Mit Strg + C benden wir den Zauber. Das ist ein typischer Befehl im Terminal zum Abbruch eines Programms. Strg + Q ist ebenso gebräuchlich.

Das ganze könnten wir nun auf 8 Kanäle ausdehnen und anstelle der Anzeige alles Mögliche steuern und regeln. Also ein sehr sinnvoller Chip, dieser MCP3008!

 

 

Kommentare   

+1 #35 Jörg Neumann 2018-08-14 19:41
Du kannst an den Eingang einen Spannungsteiler legen, um dort höhere Spannungen messen zu können. Der MCP wird dann mit Vcc 3V3 betrieben.
Zitieren
0 #34 Cora 2018-08-14 16:08
Hallo,

danke für diese Anleitung! Ich möchte einen CO2-Sensor (www.dfrobot.com/.../) an den MCP3008 anschließen. Dieser wird allerdings mit 5 V betrieben und gibt diese auch weiter. Der MCP3008 verträgt das, die GPIOs des Raspberry Pi allerdings nicht. Was muss man da dazwischen schalten?
Vielen Dank im Voraus!
Zitieren
0 #33 JoergZ 2017-11-18 18:49
Nochmals besten Dank. Könntest du bitte auch noch ein paar Werte und/oder Typbezeichnunge n ergänzen?
Zitieren
0 #32 Jörg Neumann 2017-11-17 20:35
Ich habe mal eine grundsätzliche Schaltung in unserem Downloadordner abgelegt:
Zitieren
-1 #31 JoergZ 2017-11-17 15:33
@Jörg Neumann
Danke! Habe so etwas befürchtet. Habe nicht wirklich Ahnung von Elektr(on)ik. Hast du vielleicht einen Tipp, wo ich eine solche Schaltung finden kann, die ich als größter anzunehmender Amateur nachbasteln kann.
Zitieren
-1 #30 Jörg Neumann 2017-11-17 12:12
@JörgZ: Die obige Schaltung ist für einen Spannungsteiler (in unserem Fall ein Potentiometer) ausgelegt. Der sorgt dafür, dass je nach Stellung das Verhältnis der beiden Teilwiderstände je nach Stellung eine Spannung von 0 - 3V3 am Eingang anliegt. Das ist eine absolute Minimalbeschalt ung. Das bekommt man auch nicht mit einem einzelnen Widerstand hin. Da musst du wohl oder übel eine Schaltung (im einfachsten Fall einen Transistor mit einem Widerstand und deinem Sensor als Spannungsteiler an der Basis) davorsetzten.
Zitieren
0 #29 JoergZ 2017-11-16 18:31
@Jörg Neumann
Das Skript befindet sich auf dieser Seite weiter oben. Und die Schaltung ist die, die in diesem Blogeintragung unter dem Menü Schaltung zu finden ist. Der Spanungsabfall ist sehr gering. Er macht sich erst an der 3. bzw. 4. Stelle hinter dem Komma bemerkbar, jedenfalls nach Berechnungen nach dem Ohmschen Gesetz. Ausgehend von den 3,3 V müssten Spannungen von 3,2953 V für 707 Ohm und 3,2980 für 1690 Ohm anfallen. Leider kann ich mangels ausreichend auflösendem Messgerät das nicht nachprüfen. Bezogen auf die Schaltung gehen die 3,3 V an den Widerstand und der "Ausgang" des Widerstands geht auf den PIN für den Channel 0 des MCP3008. Das ist doch analog zum Poti aus der Schaltung, oder?
Zitieren
0 #28 Jörg Neumann 2017-11-16 10:12
zitiere JoergZ:
Ich möchte einen simplen Temperaturfühler anschließen (2-Draht), der Ohmwerte zwischen 707 bei -14,4 Grad und 1690 bei 100 Grad Celsius liefert. Die Charakteristik ist linear (mit weiteren Werten ermittelt). Wenn ich diesen Widerstand mit dem Python-Skript auslese, bekomme ich nur Werte zwischen 1023 und 1021. Und es ändert sich nicht, wenn ich den Sensor aufheize oder abkühle. Es pendelt immer um diese Werte. Sind die Widerstandsunterschiede zu gering, um "verwertbare" Digitalwerte zu liefern? Kann ich da was tun?


Am analogen Eingang werden Spannungen gemessen und mit der Referenzspannun g am MCP verglichen. du musst deine Schaltung also so aufbauen, dass du einen Spannungsabfall am Eingang in diesem Bereich hast. Es liegt also eher an der Schaltung als am Phytonscript. Evtl kannst Du das benutzte Script und Deine Schaltung in unserem Forum zeigen, um dort weitere Informationen zu erhalten.
Zitieren
0 #27 JoergZ 2017-11-16 08:43
Ich möchte einen simplen Temperaturfühle r anschließen (2-Draht), der Ohmwerte zwischen 707 bei -14,4 Grad und 1690 bei 100 Grad Celsius liefert. Die Charakteristik ist linear (mit weiteren Werten ermittelt). Wenn ich diesen Widerstand mit dem Python-Skript auslese, bekomme ich nur Werte zwischen 1023 und 1021. Und es ändert sich nicht, wenn ich den Sensor aufheize oder abkühle. Es pendelt immer um diese Werte. Sind die Widerstandsunte rschiede zu gering, um "verwertbare" Digitalwerte zu liefern? Kann ich da was tun?
Zitieren
0 #26 Technik4You 2017-03-05 16:27
Hier auch was interessantes
www.youtube.com/.../
Zitieren

Warenkorb

0 Produkte - 0,00 EUR
Zum Warenkorb

Neue Produkte

miniUSB Verbindungskabel 15cm (Artikelnummer: MINIUSB15CM)
0,65 EUR
Raspberry Pi 3 Modell B+ (Artikelnummer: RASPI3BPLUS)
36,50 EUR
Acrylgehäuse NanoPi NEO AIR (Artikelnummer: GEHNANOPINEOAIR)
5,50 EUR
3D Druck Gehäuse NanoPi NEO (Artikelnummer: GEHNANOPINEO)
4,50 EUR
NanoHat Proto (Artikelnummer: NANOHATPROTO)
7,45 EUR