PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PCF8574 über Python steuern



Duesentrieb
13.03.2014, 19:28
Hallo,

ich ich bin auf der Suche nach einem kleinen Skript in dem ich das Ansprechen eines Ports des PCF8574 über Python nachvollziehen kann.
ich habe gefühlt das halbe Internet durchsucht aber nicht dergleichen gefunden. Die Beispiele die ich gefunden habe beziehen sich alle auf C.

Wäre toll wenn mir hier jemand weiterhelfen könnte

Daniel

Kampi
13.03.2014, 21:40
Hey,

du kannst eigentlich das Modul smbus in Python verwenden.
Die Handhabung ist sehr, sehr einfach:

https://pypi.python.org/pypi/smbus-cffi/0.1

Duesentrieb
15.03.2014, 13:17
Hallo Kampi,

danke für deine Unterstützung.
Ich habe jetzt mal versucht mich zurecht zu finden. Im Prinzip müsste es in der Tat ganz easy sein einen Port anzusprechen.
Mit dem angehängten kleinen Programm sollte jetzt normaler weise an den Ausgänge etwas passieren:

import smbus
import time

bus = smbus.SMBus(0)

for a in range(0,256):
bus.write_byte(0x39,a)
time.sleep(0.1)
Leider erhalte ich aber immer einen IO-Fehler den ich nicht nachvollziehen kann:


27784

27785

Was für einen Denkfehler mache ich?


********************************
Habe den Fehler gefunden!
bei der Revision 2 der B Veriante des Rapberry Pi mus der Code so lauten:


import smbus
import time

bus = smbus.SMBus(1)

for a in range(0,256):
bus.write_byte(0x39,a)
time.sleep(0.1)

Kampi
15.03.2014, 14:36
Genau :)
Wobei du auch den Bus 0 hast. Der Fehler kam daher, weil am Bus 0 kein Device mit der Adresse angeschlossen ist.

Duesentrieb
15.03.2014, 16:02
Hi,
jetzt habe ich aber gleich noch eine Frage die du mir sicher ganz schnell beantworten kannst ;)

Mit der Angabe einer Dezimalzahl werde ich nicht sehr weit kommen wenn ich die Ports einzel ansprechen möchte.
Gibt es eine einfacher Möglichkeit, einen Port zu aktivieren/deaktivieren ohne die anderen zu verändern?

Kampi
15.03.2014, 16:26
Hey,

ja, du musst die Ports einlesen und dann den Wert verändern.
Beispiel:
Bei deinem PCF sind die Pins 0, 1 und 2 gesetzt. Jetzt willst du Pin 3 mit setzen, also ließt du den Wert ein und bekommst dann als Ergebnis 0x07 (0000 0111).
Zu diesem Ergebnis addierst du jetzt 2^3, also 8. Dabei steht die 3 für den Pin den du schalten willst. Das Ergebnis der Rechnung ist 0x0F (0000 1111) und das sendest du wieder an den PCF zurück.

Duesentrieb
15.03.2014, 22:05
Hallo Kampi,

das ist ja ein ganz schöner Rechenaufwand.
Ich mache mir jetzt gerade Gedanken um die Eingabe.
Muss das wirklich so aufwendig sein...


import smbus
from time import sleep
bus = smbus.SMBus(1)

Adresse = [1, 2, 4, 8, 16, 32, 64, 128]

def main():
try:
while True:
for n in Adresse:
impuls1 = bus.read_byte_data(0x3a, n)
if impuls1 < 1:
if n == 1:
if Taster1 == 1:
Taster1 = 0
else:
Taster1 = 1

elif n == 2:
if Taster2 == 1:
Taster2 = 0
else:
Taster2 = 1

elif n == 4:
if Taster3 == 1:
Taster3 = 0
else:
Taster3 = 1

Ich möchte insgesamt 16 Taster einlesen und 16 Relais ansteuern.
Auch weis ich im Moment nochnicht wie ich einen dauerhaften Kontakt behandeln muss.

Hast du noch ein oder zwei Tips für mich?

Kampi
15.03.2014, 22:46
Hey,

wie ist den was beschaltet? In deiner if-Abfrage stehen Taster drin, aber was sind das für welche?
Generell verstehe ich auch den Sinn deiner for-Schleife nicht....
Probier es mal so:



import smbus
bus = smbus.SMBus(1)
Status = bus.read_byte(0x39)

if(Status == 1):
print "Pin 1 High"
else:
print "Pin 1 Low"
if(Status == 2):
.
.
.

Duesentrieb
16.03.2014, 06:23
Hallo,
und wieder vielen Dank! Ich saß gestern den ganzen Tag drann und habe rumgespielt und ausprobiert. Irgend wann sieht man aber den Wald vor Bäumen nicht mehr und dann kommt so etwas raus.

Na dann mal weiter, jetzt wo ich wieder auf dem rechten Weg bin :-)

Kampi
16.03.2014, 08:55
Hallo,
und wieder vielen Dank! Ich saß gestern den ganzen Tag drann und habe rumgespielt und ausprobiert. Irgend wann sieht man aber den Wald vor Bäumen nicht mehr und dann kommt so etwas raus.

Na dann mal weiter, jetzt wo ich wieder auf dem rechten Weg bin :-)

Ja das passiert schon mal :)
Fang erst einmal klein an und probier das Prinzip aus....wenn du verstanden hast wie es geht wende das Prinzip auf deine Lösung an (wobei der Codeschnipsel den ich dir geschickt habe nicht wirklich getestet wurde...also nicht wundern, falls er nicht 100%ig funktioniert :) )

Duesentrieb
16.03.2014, 09:03
Die Nervensäge schon wieder :rolleyes:

Ich habe bisher immer die einzelenen Bits auf Higth oder Low ausgewertet und dazu >> Status = bus.read_byte_data(0x39,n)<< verwendet.
Wie du mir richtiger weise erklärt hast, kann ich das auch einfacher haben.
Alllerdings bekomme ich mit >> Status = bus.read_byte(0x39)<< immer eine 128, also alle Bits auf Hight angezeigt obwohl ich andere Signale anlege.
Woran kann das liegen?

Duesentrieb
16.03.2014, 11:48
Hallo zusammen,

falls mal jemand auf des gleich Problem stoßen sollte, habe ich hier einen Lösungsansatz:


import smbus
from time import sleep
bus = smbus.SMBus(1)

Adresse = [1, 2, 4, 8, 16, 32, 64, 128]

n = 0

while Statusx != 128:
sleep(1)
for n in Adresse:
Status = bus.read_byte_data(0x3a,n)
print "Status", Status
if Status < n:
print n, "-Low"
bus.write_byte(0x38,n)