I2C-Input am PI mit Python einlesen

Vielen Dank an Jochen H. der mir folgenden Artikel geschrieben hat:

 

I2C-Eingabekarte am Raspberry PI

I2C-Eingabekarte am Raspberry PI

Das I2C-Input-Modul 5 – 24V der Firma Horter kann sehr gut vom Raspberry Pi ausgelesen werden.

Man schließt das Inputmodul einfach an die Busschnittstelle des Raspberry an (siehe oben) und kann mit Hilfe eines kleinen Pythonprogramms den PCF8574 auslesen.

Unten ist eine von mir geschrieben Pythonklasse, mit deren Hilfe man die Inputsignale auslesen kann.

Um das Programm ausführen zu können, muss der I2C-Bus erst akriviert werden und das Pythonmodul smbus installiert werden. Eine Beschreibung dazu gibts hier (http://www.skpang.co.uk/blog/archives/575).

PcfIN.py (sollte im selben Ordner sei wie Testprog.py)

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smbus
import time
ports = (0xFE,
0xFD,
0xFB,
0xF7,
0xEF,
0xDF,
0xBF,
0x7F)
class PcfIn:
def __init__(self, addr, i2cdev = 1):
self.__addr = addr
self.__bus = smbus.SMBus(i2cdev)
def get_ports(self):
ioIn = self.__bus.read_byte(self.__addr)
port = 1
for i in range(0,len(ports)):
if (ioIn | ports[i] == ports[i]):
print port
port +=1

Testprog.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import PcfIN as In         #importeiren des Klasse PcfIn
inputEins = In.PcfIn(0x38)  #Objekt erstellen mit Bitaddr 0x38
                          #beim alten Raspberry (Bitaddr, 0)
inputEins.get_ports()        #Ports abfragen

 

Der Beitrag kann auch als pdf-Datei heruntergeladen werden.

i2c-input_Raspberry

 

 

 

3 Kommentare

  1. Hallo,
    ich bekomme leider ebenfalls einen Fehler zurück:

    Traceback (most recent call last):
    File “/home/pi/Desktop/Testprog.py”, line 9, in
    inputEins.get_ports() #Ports abfragen
    File “/home/pi/Desktop/PcfIN.py”, line 22, in get_ports
    ioIn = self.__bus.read_byte(self.__addr)
    File “/usr/local/lib/python2.7/dist-packages/smbus_cffi-0.5.1-py2.7-linux-armv7l.egg/smbus/util.py”, line 59, in validator
    return fn(*args, **kwdefaults)
    File “/usr/local/lib/python2.7/dist-packages/smbus_cffi-0.5.1-py2.7-linux-armv7l.egg/smbus/smbus.py”, line 110, in read_byte
    raise IOError(ffi.errno)
    IOError: 5

    Die Abfrage über “sudo i2cget -y 1” funktioniert aber!

    Woran könnte das liegen?

  2. Hallo,

    ich habe Deinen Code probiert.
    Die Files liegen bei mir unter /home/pi/phyton
    Wenn ich das Programm ausführe kommt der Fehler:
    sudo ./Testprog.py
    Traceback (most recent call last):
    File “./Testprog.py”, line 3, in
    import PcfIN as In #importeiren des Klasse PcfIn
    File “/home/pi/phyton/PcfIN.py”, line 14
    def __init__(self, addr, i2cdev = 1):
    ^
    IndentationError: expected an indented block

    Hast Du eine Idee?

    I2C auf der Console funktioniert.

    Danke und Grüße
    Andi

    • Hallo Andi,
      dein Fehler dürfte nur ein Einrückungsfehler sein.
      Du solltest die Einrückungen wie im PDF-Dokument genau beachten, dann sollte der Code auch funktionieren (Python verwendet Einrücken wie Java geschweifte Klammern). Falls du noch eine Methode benötigst, mit der du den Zustand bestimmter Inputs speziell abfragen kannst, schreib mir einfach eine Email.

      Gruß Jochen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.