I2C-Digital-Output-Modul mit Python und TkInter am Raspberry

In diesem Beitrag wollen wir zeigen wie man die I2C-Module mit Python ansteuern kann.

Als Visualisierung bzw. zum Bedienen wird TkInter benutzt.

 

Ausgänge vom I2HA-Modul mit Button-Tasten EIN und AUS schalten

Unsere Demo-Bedienoberfläche hat acht EIN- und acht AUS-Tasten. Diese werden im Programm hinter den Kommentaren

#EIN-Button-Layout

und

#AUS-Button-Layout

definiert.

So sieht’s aus:

I2C-Output Modul mit Tasten steuern

I2C-Output Modul mit Tasten steuern

 

Module importieren und Globale Variable definieren

im Hauptprogramm werden einige  Module importiert.

Außerdem braucht jede Ausgabekarte eine globale Variable die wir einfach mal o1 für die erste Output-karte nennen

import tkinter
from tkinter import *
from tkinter import ttk
import smbus

bus = smbus.SMBus(1)
mainWin = Tk()
mainWin.title(‚LED_TEST‘)

o1 = 0

diese Variable wird dann in den Unterprogrammen der Tasten manipuliert.

Falls der Import vom SM-Bus nicht funktioniert muss dieser erst noch auf dem Raspberry-Pi installiert werden. Diese Anleitung hilft dabei recht gut. https://pypi.python.org/pypi/smbus-cffi

 

Funktion Bit setzten / rücksetzten in Variable

Das Setzten und das Rücksetzten eines einzelnen Bits in einer Variable haben wir in Funktionen gepackt.
Die Ausgabe in die Python Shell kann auch weg gelassen werden.

#Funktion Setze Bit in Variable / Function Set Bit in byte
def
set_bit(value, bit):
print(value | (1<<bit))    #Ausgabe in der Python Shell
return value | (1<<bit)

#Funktion rücksetzte Bit in Variable / Function reset Bit in byte
def
clear_bit(value, bit):
print(value & ~(1<<bit))    #Ausgabe in der Python Shell
return value & ~(1<<bit)

 

Schaltbefehl der Ausgänge auf Button

Wird z.B. die EIN-Taste gedrückt, ruft sich das Unterprogramm der entsprechenden Taste auf.

Beispiel Taste 1 EIN

def button_1e():
global o1
o1 = set_bit(o1, 0)
bus.write_byte(0x20,255set_bit(o1, 0))

In der zweiten Zeile wird angegeben, dass im Unterprogramm die globale Variable o1 verwendet werden soll.

In der dritten Zeile wird in der globalen Variable das Bit null gesetzt

In der vierten Zeile wird die Variable invertiert und auf den I2C-Bus zum Slave an Adresse 0x20 übertragen.

 

Programmcode

import tkinter
from tkinter import *
from tkinter import ttk
import smbus

bus = smbus.SMBus(1)
mainWin = Tk()
mainWin.title('LED_TEST')

o1 = 0

#Funktion Setze Bit in Variable / Function Set Bit in byte
def set_bit(value, bit):
    print(value | (1<<bit))
    return value | (1<<bit)

#Funktion rücksetzte Bit in Variable / Function reset Bit in byte
def clear_bit(value, bit):
    print(value & ~(1<<bit))
    return value & ~(1<<bit)


#Buttonbefehle
def button_1e():
    global o1
    o1 = set_bit(o1, 0)
    bus.write_byte(0x20,255-o1)
def button_2e():
    global o1
    o1 = set_bit(o1, 1)
    bus.write_byte(0x20,255-o1)
def button_3e():
    global o1
    o1 = set_bit(o1, 2)
    bus.write_byte(0x20,255-o1)
def button_4e():
    global o1
    o1 = set_bit(o1, 3)
    bus.write_byte(0x20,255-o1)
def button_5e():
    global o1
    o1 = set_bit(o1, 4)
    bus.write_byte(0x20,255-o1)
def button_6e():
    global o1
    o1 = set_bit(o1, 5)
    bus.write_byte(0x20,255-o1)
def button_7e():
    global o1
    o1 = set_bit(o1, 6)
    bus.write_byte(0x20,255-o1)
def button_8e():
    global o1
    o1 = set_bit(o1, 7)
    bus.write_byte(0x20,255-o1)


def button_1a():
    global o1
    o1 = clear_bit(o1, 0)
    bus.write_byte(0x20,255-o1)
def button_2a():
    global o1
    o1 = clear_bit(o1, 1)
    bus.write_byte(0x20,255-o1)
def button_3a():
    global o1
    o1 = clear_bit(o1, 2)
    bus.write_byte(0x20,255-o1)
def button_4a():
    global o1
    o1 = clear_bit(o1, 3)
    bus.write_byte(0x20,255-o1)
def button_5a():
    global o1
    o1 = clear_bit(o1, 4)
    bus.write_byte(0x20,255-o1)
def button_6a():
    global o1
    o1 = clear_bit(o1, 5)
    bus.write_byte(0x20,255-o1)
def button_7a():
    global o1
    o1 = clear_bit(o1, 6)
    bus.write_byte(0x20,255-o1)
def button_8a():
    global o1
    o1 = clear_bit(o1, 7)
    bus.write_byte(0x20,255-o1)


#EIN-Button-Layout
label_1 = ttk.Label(mainWin, text='Ein').grid(column=1,row=1)
Button_1 = ttk.Button(mainWin, text='LED 1', command = button_1e).grid(column=1,row=2)
Button_2 = ttk.Button(mainWin, text='LED 2', command = button_2e).grid(column=1,row=3)
Button_3 = ttk.Button(mainWin, text='LED 3', command = button_3e).grid(column=1,row=4)
Button_4 = ttk.Button(mainWin, text='LED 4', command = button_4e).grid(column=1,row=5)
Button_5 = ttk.Button(mainWin, text='LED 5', command = button_5e).grid(column=1,row=6)
Button_6 = ttk.Button(mainWin, text='LED 6', command = button_6e).grid(column=1,row=7)
Button_7 = ttk.Button(mainWin, text='LED 7', command = button_7e).grid(column=1,row=8)
Button_8 = ttk.Button(mainWin, text='LED 8', command = button_8e).grid(column=1,row=9)

#AUS-Button-Layout
label_1 = ttk.Label(mainWin, text='Aus').grid(column=2,row=1)
Button_1a = ttk.Button(mainWin, text='LED 1', command = button_1a).grid(column=2,row=2)
Button_2a = ttk.Button(mainWin, text='LED 2', command = button_2a).grid(column=2,row=3)
Button_3a = ttk.Button(mainWin, text='LED 3', command = button_3a).grid(column=2,row=4)
Button_4a = ttk.Button(mainWin, text='LED 4', command = button_4a).grid(column=2,row=5)
Button_5a = ttk.Button(mainWin, text='LED 5', command = button_5a).grid(column=2,row=6)
Button_6a = ttk.Button(mainWin, text='LED 6', command = button_6a).grid(column=2,row=7)
Button_7a = ttk.Button(mainWin, text='LED 7', command = button_7a).grid(column=2,row=8)
Button_8a = ttk.Button(mainWin, text='LED 8', command = button_8a).grid(column=2,row=9)

mainWin.mainloop()


 

 

 

 

 

 

Speichere in deinen Favoriten diesen permalink.

Ein Kommentar

  1. Hallo Zusammen,

    ich habe ein Output Modul an meinen Raspberry angeschlossen und dass oben beschriebene Programm ablaufen lassen. Zum Teil kann ich die LEDs auf dem Board ansteuern, jedoch bekomme ich manchmal den unten beschriebenen Fehler. Wenn dieser Fehler kommt, wird die ausgewählte LED nicht gesetzt. Wenn ich direkt danach jedoch wieder diese LED drücke, funktioniert es.
    Ich bin bisschen ratlos, vielleicht könnt ihr mir ja helfen.
    (FYI: ich habe am Ausgang keine VSS anliegen und keine Last die geschalten wird, da ich zuerst den Programm-Code ausprobieren will. Ist das vielleicht ein Problem?)

    Exception in Tkinter callback
    Traceback (most recent call last):
    File „/usr/lib/puthon3, 8/tkinter/__init__.py“, line 1892, in __call_
    retum self, func(*args)
    File „/home/david/Projektarbeit/git/Caipi_Projektarbeit/Output,py“, line 39, in button_de
    bus,urite_byte(0x21,255-01)
    File “/home/david/Projektarbeit/enw‘1ib/python3,9/site-packages/smbus/uti1.py“, line 59, in validator
    retum FnC*args, **kudefaults)
    File „/home/david/Projektarbeit/enw’1ib/python3,9/site-packages/smbus/snbus,py“, line 121, in write_byte
    raise IOError(FFi,errno)
    OSError: 121

Schreibe einen Kommentar

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