Schaltungen
  • Registrieren

Beitragsseiten

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)

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