Hallo liebe Python Profis,
Also folgendes Problemchen ich versuche über python ein 32x32 RGB Display anzusprechen.
Das display besteht aus 2x 16xDemultiplexern (angesteuert über die pins a,b,c,d) und mehreren 32x Schieberegistern (Verschiedene Pins xxxZero ist für das obere Register, xxxOne für die unteren Register). Manuell kann ich die Register und demultiplexer auch sauber ansprechen nur in meinem Code ist irgendwo der Wurm drin. Über meinem automatischen Script steuere ich nur jedes zweite Demultiplexer Feld an obwohl mit die Funktion mit der Variable demux eigentlich die richtigen (16) Kombination durchgibt.
Die Grundidee war eine 32x32 Matrix auszulesen in der das gewünschte Bild hinterlegt ist.
Jetzt erstmal der gesamte Code:
#Gpio importieren
import RPi.GPIO as GPIO
import time
# use P1 header pin numbering convention
GPIO.setmode(GPIO.BOARD)
# Bereits gesetzte Gpio warnung deaktivieren
GPIO.setwarnings(False)
#Pins als Variablen setzen Bei Veraenderung der Pinkonfiguration anpassen
redZero = 11
greenZero = 12
blueZero = 15
redOne = 16
greenOne = 18
blueOne = 22
a = 26
b = 24
c = 21
d = 19
oe = 13
clock = 23
latch = 7
# GPIO Pin - als output
GPIO.setup(redZero, GPIO.OUT)
GPIO.setup(greenZero, GPIO.OUT)
GPIO.setup(blueZero, GPIO.OUT)
GPIO.setup(redOne, GPIO.OUT)
GPIO.setup(greenOne, GPIO.OUT)
GPIO.setup(blueOne, GPIO.OUT)
GPIO.setup(a, GPIO.OUT)
GPIO.setup(b, GPIO.OUT)
GPIO.setup(c, GPIO.OUT)
GPIO.setup(d, GPIO.OUT)
GPIO.setup(oe, GPIO.OUT)
GPIO.setup(clock, GPIO.OUT)
GPIO.setup(latch, GPIO.OUT)
#Variable fuer den Takt
sleepTime = 0.0001
#Variable fuer den Takt um die LEDs laenger Licht aufbauen zu lassen
sleepTime = 0.0001
# GPIOListe (array)
gpioList = [redZero, greenZero, blueZero, redOne, greenOne, blueOne, a, b, c, d, oe, clock, latch]
#Belegungstabelle erstellen und belegen Einzigste benoetigte Variable fuer das geplante Modul; Table(Reihe, Spalte)
table= [[ 0 for g in range(32) ] for h in range(32)]
table [1][1] = 1
table [1][2] = 1
table [2][1] = 1
table [2][2] = 1
table [17][1] = 1
table [17][2] = 1
table [18][1] = 1
table [18][2] = 1
table [31][31] = 1
# Kontrollfunktion zu Matrix Darstellung
#for x in range(32):
# print table[x]
nana = 0
while nana <= 10000:
for j in range(16):
for i in range(32):
if table [j][i] == 0:
GPIO.output(redZero, GPIO.LOW)
GPIO.output(clock, GPIO.HIGH)
GPIO.output(clock, GPIO.LOW)
elif table [j][i] == 1:
GPIO.output(redZero, GPIO.HIGH)
GPIO.output(clock, GPIO.HIGH)
GPIO.output(clock, GPIO.LOW)
GPIO.output(redZero, GPIO.LOW)
# bin wandelt j in binaer Zahl um, zfill fuellt auf 4 Stellen auf, 2: kuerzt die ersten beiden Stellen (0b),list erstellt eine Liste
demux = list(bin(j)[2:].zfill(4))
print demux
# steuert den Demultiplexer an, aber nur jede zweite Zeile ???
for x in range(4):
if demux[x] == '0':
GPIO.output(gpioList[10-x], False)
#print gpioList[10-x], "auf False",
elif demux[x] == '1':
GPIO.output(gpioList[10-x], True)
#print gpioList[10-x], "auf True",
# setzt das Signal
GPIO.output(latch, GPIO.HIGH)
GPIO.output(latch, GPIO.LOW)
# time.sleep(sleepTime)
nana = nana +1
#Spaeter noch Zeile fuer zweite Row einfuegen sollte man eigentlich parallel betreiben koennen
print 'Testscript beendet'
Alles anzeigen
"Print Demux"
liefert mir alle 16 Kombinationen in der gewünschten Reihenfolge
"print gpiolist" zeigt mir auch an das die Kombinationen korrekt (so vermute ich) gesetzt werden
Auf dem Display erscheint aber eben nur jede zweite Zeile nur verstehe ich nicht warum
Vielen Dank
Tipps wie der Code cleverer gestaltet werden kann sind natürlich auch willkommen.