Guten Abend liebe Community,
Nach nun geschätzten 13h getüftle und versuchen, wende ich mich einfach mal an euch
Ich habe über die Möglichkeit gelesen, mit dem Pi und dem MCP3008 analoge Werte zu verarbeiten.
Die ist, falls nicht bekannt ein A/D-Wandler mit 10bit.
Ergo ist der maximale Wert den er ausgibt 2^10 = 1024-1 = 1023
Natürlich habe ich versucht, mein Problem selbst zu lösen, durch das rumgewusel in diversen Threads, dem durchlesen etlicher Anleitungen, hundertfaches kontrollieren meiner Sachen und so weiter...
Als kleinen Bleistift, diese Foren/Threads:
https://forum-raspberrypi.de/www.forum-rasp…ssen-mit-dem-pi
https://forum-raspberrypi.de/www.forum-rasp…rieueberwachung
Externe Foren:
Spoiler anzeigen
Und noch viele andere, die Tabs habe ich aber weder am Laptop, Smartphone noch am Pc offen, eigentlich so alles was google mir im zusammenhang mit dem Pi und dem MCP3008 ausgespuckt hat, der 3208 und ich mein der 3002 sind auch des öfteren dazwischen gewesen...
Leider habe ich daraus, keine Lösung meines Problems beziehen können... vielleicht habe ich sie auch einfach überlesen oder Gott weiß nicht was. Bin auch nur ein Mensch am Abgrund der Verzweiflung Also nicht böse nehmen, wenn ihr mein Problem aus bereits existierenden Threads kennt
Wie aus den oben genannten Foren zu entnehmen ist, möchte ich gerne mit meinem Pi die Spannung eines Akkus messen. Es handelt sich dabei um eine Autobatterie, bzw. derzeit einen alten akku aus einer BMZ den ich noch rumfliegen hatte.
---
Als Test habe ich jedoch 3,3v als Spannung genommen.
VDD und VREF waren ebenfalls 3,3v (alles aus der gleichen Spannungsquelle, dem Pi)
Kurz: ich habe 1zu1 das Beispiel von Erik Bartmann genommen, habe lediglich die GPIO geändert.
1. Versuch
VDD = 3,3V vom Pi
VREF = 3,3V vom PI
GND = GND vom PI
SCLK = 17
MOSI = 27
MISO = 22
CS = 04
GND = GND vom PI
2. Versuch
VDD = 3,3V vom Pi
VREF = 3,3V vom PI
GND = GND vom PI
SCLK = 11
MOSI = 10
MISO = 09
CS = 04
GND = GND vom PI
3.Versuch
VDD = 3,3V vom Pi
VREF = 3,3V vom PI
GND = GND vom PI
SCLK = 11
MOSI = 10
MISO = 09
CS = 01
GND = GND vom PI
A/D-Channel 0 = 10K Ohm Poti (Zum verändern des Ausgabewertes.)
-----------------------------------------------
Den Á/D-Channel habe ich auch schon bei allen konstilationen von 0-7 durchprobiert.
Hier mein Pythonscript:
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
HIGH = True
LOW = False
def readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin):
GPIO.output(CSPin, HIGH)
GPIO.output(CSPin, LOW)
GPIO.output(SCLKPin, LOW)
sendcmd = adcChannel
sendcmd |= 0b00011000
for i in range(5):
if (sendcmd & 0x10):
GPIO.output(MOSIPin, HIGH)
else:
GPIO.output(MOSIPin, LOW)
GPIO.output(SCLKPin, HIGH)
GPIO.output(SCLKPin, LOW)
sendcmd <<= 1
adcvalue = 0
for i in range(11):
GPIO.output(SCLKPin, HIGH)
GPIO.output(SCLKPin, LOW)
adcvalue <<= 1
if(GPIO.input(MISOPin)):
adcvalue |= 0x01
time.sleep(2)
return adcvalue
ADC_Channel = 0
SCLK = 17
MOSI = 27
MISO = 22
CS = 4
GPIO.setup(SCLK, GPIO.OUT)
GPIO.setup(MOSI, GPIO.OUT)
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS, GPIO.OUT)
while True:
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
Alles anzeigen
Führe ich das Script nun mit
sudo python MCP3008.py
aus, läuft es auch, als Werte bekomme ich jedoch nur "0"
egal, wie ich am Poti drehe, es verändert sich nichts.
Die Spannung habe ich dabei mit einem Voltmeter überwacht, um die Funktionsfähigkeit meines Potis zu versichern. von 0 - 3,3V alles dabei.
Zwischenzeitlich habe ich es auch hinbekommen, fragt mich nicht wie oder warum, dass ich 3-6 mal wirkliche Werte angezeigt bekommen habe.
Damit mein ich, dass beim Start des Scripts die ersten 3-6 Werte keine "0" waren sondern z.b. "634", "752"... je nachdem wie das Poti halt stand.
Nach diesen ersten 3-6 "vernünftigen" Werten, kam eine: "2047" und ab dann nur noch "0"
Die "2047" tauchte auch nicht immer auf, ab und an blieb sie aus und es ging einfach mit "0" weiter.
Derzeit, bin ich wieder da, wo ich ganz am Anfang war und zwar, dass egal was ich mach die Werte von vornerein "0" sind und nichts anderes mehr.
Vorallem, warum habe ich den Wert "2047" ausgegeben bekommen, als ein A/D-Wandler mit 10bit, kann er diesen Wert doch gar nicht ausgeben, oder irre ich mich da ?
Die GPIOS
7
8
25
24
23
18
Kann ich nicht verwenden, da ich an diesen Bereits ein LCD-Display angeschlossen habe.
Ich habe diesen Post, so übersichtlich gestaltet, wie es meine kreativität zulässt, bei Fragen oder Unklarheiten: bescheid geben, danke...
Mir wird des öfteren gesagt, dass ich bei sowas gern ein komplizierter Mensch bin und es schwer für andere ist, sich in meine Arbeit bzw. in mein Machen reinzudenken.
Kann sich irgendjemand ein Bild von dem machen, was ich versucht habe zu beschreiben ? :s
tl;dr
Spoiler anzeigen
Pi -> A/D-Wandler(MCP3008) != Werte
Case1: Werte = 3-6x OK => 2047 => 0.....n
Case2: Werte = 3-6x OK => 0.....n
Case3: Werte = 0.....n
Poti 10K Ohm = 3,3V PI -> CH0 - 7
GPIO
VDD 3,3V PI
VREF 3,3V Pi
GND GND PI
SCLK 17, 11, 11
MOSI 27, 10, 10
MISO 22, 09, 09
CS 04, 01, 04
GND GND PI
GPIO Already in use: 7, 8, 18, 23, 24, 25 (LCD-Display)
Script:
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
HIGH = True
LOW = False
def readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin):
GPIO.output(CSPin, HIGH)
GPIO.output(CSPin, LOW)
GPIO.output(SCLKPin, LOW)
sendcmd = adcChannel
sendcmd |= 0b00011000
for i in range(5):
if (sendcmd & 0x10):
GPIO.output(MOSIPin, HIGH)
else:
GPIO.output(MOSIPin, LOW)
GPIO.output(SCLKPin, HIGH)
GPIO.output(SCLKPin, LOW)
sendcmd <<= 1
adcvalue = 0
for i in range(11):
GPIO.output(SCLKPin, HIGH)
GPIO.output(SCLKPin, LOW)
adcvalue <<= 1
if(GPIO.input(MISOPin)):
adcvalue |= 0x01
time.sleep(2)
return adcvalue
ADC_Channel = 0
SCLK = 17
MOSI = 27
MISO = 22
CS = 4
GPIO.setup(SCLK, GPIO.OUT)
GPIO.setup(MOSI, GPIO.OUT)
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS, GPIO.OUT)
while True:
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
Alles anzeigen
Für die interessierten, warum ich das unbedingt brauch, s.h. Das bild im Anhang.
Das dinge will ich nicht nur über den Netzbetrieb laufen lassen können, sondern auch über z.b. Autobatterien und dann wäre es ganz nützlich, neben den Systemdaten wie CPU Auslastung, Temperatur etc. auch die Spannung der Batterie anzeigen zu lassen, um die restliche Laufzeit abschätzen zu können.
Mfg
Lars
Ich hoffe, ich nerve euch nicht schon mit meinem ersten Thread ;D
//Edit: 16.08.2014 14:39Uhr
Ich habe jetzt die GPIOS vom Display (18,23,24,25) umgesetzt auf 4,17,27,22, damit ich den MCP3008 wie in der Anleitung beschrieben an die GPIO 18,23,24,25 anschließen konnte.
Das Resultat war: Ich bekomme immernoch keine Werte sondern die ganz Zeit nur "0", wenn ich das Script ausführe.
Das Display hat nun nicht mehr alle 4Systemdaten gezeigt (Ram, CPU TEMP, Ethernet daten, laufzeit..) Sondern nur noch den RAM und ab und an die CPU TEMP.
Sind nicht alle GPIOS als Ausgänge geeignet ? also sind z.b. 17,27,22 keine frei Programmierbaren GPIOS? oder sind diese einfach an meinem PI kaputt ? Wäre ärgerlich, da ich diese jetzt das erste mal verwende...
Ich denke ein defekt des MCP3008 kann ich auch langsam in Erwägung ziehen, da dieser ja keine Werte rausgibt, auch nicht wenn ich die in der Anleitung beschriebenen GPIOS verwende...
Falls jemand eine Idee hat oder sonstiges, ich würde mich freuen
//Edit: 16.08.2014 18:30Uhr
Alles klar, habs ans Laufen bekommen.
Die GPIOS sind wohl doch nicht soooo frei verwendbar für das Teil...
Nachdem ich den SPI-Bus freigeschaltet hatte, den MCP3008 folgendermaßen angeschlossen habe:
VDD = 3,3v
VREF = 3,3v
GND = GND
SCLK = 11
MISO = 09
MOSI = 10
CS = 07
----------------
Ein anderes Script, verwendet habe, welches ich im Internet gefunden habe:
#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 Verstaendnis 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 pruefen 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 zuruecksetzen
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(1)
return adchvalue
# Konfiguration Eingangskanal und GPIOs Raspi-Belegung
#CH = 0 # Analog/Digital-Channel
CLK = 11 # Clock alles GPIO-Nummern GPIO1
DIN = 10 # Digital in
DOUT = 9 # Digital out
CS = 8 # Chip-Select
# Pin-Programmierung
GPIO.setup(CLK, GPIO.OUT)
GPIO.setup(DIN, GPIO.OUT)
GPIO.setup(DOUT, GPIO.IN)
GPIO.setup(CS, GPIO.OUT)
try:
while True:
for z in range (8):
if (z ==0 or z==1):
print "Kanal " + str(z) + ": " + str(getAnalogData(z, CLK, DIN, DOUT, CS))
else
print "Kanal " + str(z) + ": " + "- - - "
#except KeyboardInterrupt:
finally:
GPIO.cleanup()
Alles anzeigen
bekomme ich nun auch die Werte ausgegeben
Den SPI-BUS schaltet man wie folgt frei:
sudo nano /etc/modprobe.d/raspi-blacklist.conf
Dann einfach "blacklist spi-bcm2708" auskommentieren, speichern und den PI neustarten.
Damit ist der SPI-BUS aktiv und kann nun verwendet werden.
Die Pins des SPI-BUS sind:
09 MISO (Input)
10 MOSI (Output)
11 SCLK (Schiebetakt)
07 CS1 (Chipselect)
08 CS2 (Chipselect)
Gott was war das eine Plankerei!
Ich bin auch noch Heilfroh, dass ich den 7er vom Display wegnehmen und umsetzen konnte ohne Probleme...
Immerhin, kann der nächste der das gleiche Problem hat, hier auch die Lösung finden