commit
4d17ecbd55
4 changed files with 360 additions and 0 deletions
@ -0,0 +1,126 @@
@@ -0,0 +1,126 @@
|
||||
#!/usr/bin/python |
||||
import time |
||||
try: |
||||
import RPi.GPIO as GPIO |
||||
except: |
||||
print "Was not able to import GPIO" |
||||
exit() |
||||
|
||||
class MCP23S17(object): |
||||
|
||||
def send(self, value): |
||||
# wert senden |
||||
for i in range(8): |
||||
if (value & 0x80): |
||||
GPIO.output(self.mosi, GPIO.HIGH) |
||||
else: |
||||
GPIO.output(self.mosi, GPIO.LOW) |
||||
# negative flanke des clocksignals generieren |
||||
GPIO.output(self.clock, GPIO.HIGH) |
||||
GPIO.output(self.clock, GPIO.LOW) |
||||
value <<=1 # Bitfolge eine Position nach links schieben |
||||
|
||||
def sendSPI(self, register, data): |
||||
GPIO.output(self.cable_select, GPIO.LOW) # CS aktiv (LOW-Aktiv) |
||||
self.send(self.opcode) |
||||
self.send(register) |
||||
self.send(data) |
||||
GPIO.output(self.cable_select, GPIO.HIGH) # CS inaktiv |
||||
|
||||
|
||||
def readSPI(self,register): |
||||
value = 0 |
||||
|
||||
GPIO.output(self.cable_select, GPIO.LOW) # CS aktiv (Low-Aktiv) |
||||
self.send(self.opcode|0x01) |
||||
self.send(register) |
||||
for i in range(8): |
||||
value <<= 1 |
||||
if (GPIO.input(self.miso)): |
||||
value |= 0x01 |
||||
GPIO.output(self.clock, GPIO.HIGH) |
||||
GPIO.output(self.clock, GPIO.LOW) |
||||
GPIO.output(self.cable_select, GPIO.HIGH)# CS deaktivieren |
||||
|
||||
return value |
||||
|
||||
def activateAdressing(self): |
||||
print " activating adressing for chip #{}".format(self.addr) |
||||
self.sendSPI(0x0A, 0x08) |
||||
self.sendSPI(0x0B, 0x08) |
||||
|
||||
def activatePullups(self): |
||||
print " activating pullups for chip #{}".format(self.addr) |
||||
self.sendSPI(0x0C, 0xFF) # Pullups (de)aktivieren |
||||
self.sendSPI(0x0D, 0xFF) # Pullups (de)aktivieren |
||||
|
||||
def setDirection(self, dirA, dirB): |
||||
print " setting directions for chip #{}".format(self.addr) |
||||
self.sendSPI(0x00, dirA) # In/Out setzen |
||||
self.sendSPI(0x01, dirB) # In/Out setzen |
||||
|
||||
def invertLogic(self): |
||||
print " activating inverted logic for chip #{}".format(self.addr) |
||||
self.sendSPI(0x02,0xFF) # Logik invertieren |
||||
self.sendSPI(0x03,0xFF) # Logik invertieren |
||||
|
||||
def reset(self): |
||||
self.activateAdressing(); |
||||
if self.input: |
||||
self.setDirection(0xff,0xff) |
||||
self.activatePullups(); |
||||
self.invertLogic() |
||||
else: |
||||
self.setDirection(0x00,0x00) |
||||
|
||||
|
||||
def __init__(self,addr,cable_select, clock, miso, mosi,input): |
||||
print "Creating chip with address {}".format(addr); |
||||
self.addr=addr |
||||
self.opcode = addr<<1 | 0x40 |
||||
self.cable_select=cable_select |
||||
self.clock=clock |
||||
self.miso=miso |
||||
self.mosi=mosi |
||||
self.input=input |
||||
self.reset() |
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
GPIO.cleanup() |
||||
GPIO.setmode(GPIO.BOARD); |
||||
GPIO.setwarnings(True); |
||||
|
||||
CS=13 |
||||
CLK=11 |
||||
MOSI=7 |
||||
MISO=5 |
||||
|
||||
CS=16 |
||||
CLK=12 |
||||
MOSI=10 |
||||
MISO=8 |
||||
print "configuring line pins." |
||||
GPIO.setup(CLK, GPIO.OUT) |
||||
GPIO.setup(MOSI, GPIO.OUT) |
||||
GPIO.setup(MISO, GPIO.IN) |
||||
GPIO.setup(CS, GPIO.OUT) |
||||
|
||||
print "initializing line level." |
||||
GPIO.output(CS, GPIO.HIGH); |
||||
GPIO.output(CLK, GPIO.LOW); |
||||
chip = MCP23S17(0,CS, CLK, MISO, MOSI,False) |
||||
|
||||
chip.sendSPI(0x13,0) |
||||
chip.sendSPI(0x12,0) |
||||
time.sleep(1) |
||||
|
||||
chip.sendSPI(0x13,0b11111111) |
||||
chip.sendSPI(0x12,0b11111111) |
||||
time.sleep(1) |
||||
chip.sendSPI(0x13,0) |
||||
chip.sendSPI(0x12,0) |
||||
|
||||
GPIO.cleanup() |
@ -0,0 +1 @@
@@ -0,0 +1 @@
|
||||
Python-basiertes Steuer-Programm für die LED-Matrix |
@ -0,0 +1,163 @@
@@ -0,0 +1,163 @@
|
||||
#!/usr/bin/python |
||||
from MCP23S17 import * |
||||
from thread import * |
||||
from random import randint |
||||
|
||||
class lightChip(MCP23S17): |
||||
def __init__(self, addr,cable_select,clock,miso,mosi): |
||||
MCP23S17.__init__(self,addr, cable_select, clock, miso, mosi, False) |
||||
self.setDirection(0xff,0x00) # configure a as input, b as outputs |
||||
self.sendSPI(0x0C, 0xFF) # pullups aktivieren |
||||
self.sendSPI(0x02, 0xFF) # logik invertieren |
||||
self.state=[0,0,0,0,0,0,0,0] |
||||
start_new_thread(self.shine,()) |
||||
|
||||
def shine(self): |
||||
self.shining=True |
||||
lastval = 0 |
||||
selected = 0 |
||||
while self.shining: |
||||
d=0 |
||||
for t in range(10,0,-1): |
||||
for chnl in range(0,8): |
||||
if self.state[chnl]>=t: |
||||
d|=1<<chnl |
||||
self.sendSPI(0x13,d) |
||||
time.sleep(0.00001) |
||||
val = self.readSPI(0x12); |
||||
if val != lastval: |
||||
if val == 32: |
||||
selected = (selected+1) % 8 |
||||
start_new_thread(self.blink,(selected,)) |
||||
elif val == 64: |
||||
self.state[selected] = min(self.state[selected]+1,10) |
||||
elif val == 128: |
||||
self.state[selected] = max(self.state[selected]-1,0) |
||||
elif val == 96: |
||||
for channel in range(0,8): |
||||
self.state[channel]=10 |
||||
elif val == 192: |
||||
for channel in range(0,8): |
||||
self.state[channel]=0 |
||||
elif val == 160: |
||||
self.halloween() |
||||
else: |
||||
print val |
||||
|
||||
lastval = val |
||||
self.sendSPI(0x13,0) |
||||
print "stopped" |
||||
|
||||
def activate(self,num): |
||||
self.sendSPI(0x13,1<<(num-1)) |
||||
|
||||
def halloween(self): |
||||
for c in range(0,50): |
||||
channel = randint(1,8) |
||||
duration = randint(10,100)/400.0 |
||||
count = randint(1,20) |
||||
pause = randint(1,120) |
||||
for i in range(0,count): |
||||
self.activate(channel) |
||||
time.sleep(randint(0,20)/250.0) |
||||
self.activate(11) |
||||
time.sleep(randint(10,150)/200.0) |
||||
self.activate(6) |
||||
time.sleep(pause) |
||||
|
||||
|
||||
def blink(self,channel): |
||||
old = self.state[channel] |
||||
for c in range(0,2): |
||||
self.state[channel] = 1 |
||||
time.sleep(0.01) |
||||
self.state[channel] = 0 |
||||
time.sleep(0.2) |
||||
self.state[channel] = old |
||||
|
||||
if __name__ == "__main__": |
||||
GPIO.cleanup() |
||||
GPIO.setmode(GPIO.BOARD); |
||||
GPIO.setwarnings(True); |
||||
|
||||
CS=13 |
||||
CLK=11 |
||||
MOSI=7 |
||||
MISO=5 |
||||
|
||||
CS=16 |
||||
CLK=12 |
||||
MOSI=10 |
||||
MISO=8 |
||||
print "configuring line pins." |
||||
GPIO.setup(CLK, GPIO.OUT) |
||||
GPIO.setup(MOSI, GPIO.OUT) |
||||
GPIO.setup(MISO, GPIO.IN) |
||||
GPIO.setup(CS, GPIO.OUT) |
||||
|
||||
print "initializing line level." |
||||
GPIO.output(CS, GPIO.HIGH); |
||||
GPIO.output(CLK, GPIO.LOW); |
||||
chip = lightChip(0,CS, CLK, MISO, MOSI) |
||||
|
||||
t=0.06 |
||||
for i in range(0,6): |
||||
for b in range(1,11): |
||||
for c in range(0,8): |
||||
chip.state[c]=b |
||||
time.sleep(t) |
||||
time.sleep(0.5) |
||||
for b in range(10,-1,-1): |
||||
for c in range(0,8): |
||||
chip.state[c]=b |
||||
time.sleep(t) |
||||
|
||||
t=0.1 |
||||
for i in range(0,20): |
||||
|
||||
chip.state[1]=10 |
||||
time.sleep(t) |
||||
chip.state[1]=0 |
||||
|
||||
chip.state[4]=10 |
||||
time.sleep(t) |
||||
chip.state[4]=0 |
||||
|
||||
chip.state[2]=10 |
||||
time.sleep(t) |
||||
chip.state[2]=0 |
||||
|
||||
chip.state[3]=10 |
||||
time.sleep(t) |
||||
chip.state[3]=0 |
||||
|
||||
chip.state[6]=10 |
||||
time.sleep(t) |
||||
chip.state[6]=0 |
||||
|
||||
chip.state[7]=10 |
||||
time.sleep(t) |
||||
chip.state[7]=0 |
||||
|
||||
chip.state[7]=0 |
||||
t=0.06 |
||||
for i in range(0,100): |
||||
chip.state[1]=10 |
||||
chip.state[2]=10 |
||||
chip.state[3]=10 |
||||
chip.state[4]=10 |
||||
chip.state[5]=10 |
||||
time.sleep(t) |
||||
chip.state[1]=0 |
||||
chip.state[2]=0 |
||||
chip.state[3]=0 |
||||
chip.state[4]=0 |
||||
chip.state[5]=0 |
||||
|
||||
chip.state[0]=10 |
||||
chip.state[7]=10 |
||||
time.sleep(t) |
||||
chip.state[7]=0 |
||||
chip.state[0]=0 |
||||
time.sleep(1) |
||||
GPIO.cleanup() |
@ -0,0 +1,70 @@
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/python |
||||
from MCP23S17 import * |
||||
from lightChip import * |
||||
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer |
||||
|
||||
class HTTPServ(BaseHTTPRequestHandler): |
||||
|
||||
def do_GET(self): |
||||
try: |
||||
self.send_response(200) |
||||
self.send_header('Content-Type','text/html') |
||||
self.end_headers() |
||||
parts = self.path.split('/',2) |
||||
chanel=int(parts[1]) |
||||
prec=int(parts[2]) |
||||
self.wfile.write('<html>'); |
||||
self.wfile.write('<head><title></title><style>*{ background-color: #000; color: #fff; } td{ text-align: center; border: 1px solid #222; border-radius: 5px; padding: 5px; } table{ border-spacing: 10px 0; width: 100%; height: 100%}</style></head>'); |
||||
self.wfile.write('<body>') |
||||
self.wfile.write('<table>'); |
||||
self.wfile.write("<tr>\n"); |
||||
self.wfile.write("</tr>\n"); |
||||
for dim in range(0,11): |
||||
self.wfile.write("<tr>\n"); |
||||
for col in range(0,8): |
||||
self.wfile.write('<td onclick="window.location=\'../../{}/{}\';">{}/{}</td>'.format(col,dim,(1+col),dim)) |
||||
self.wfile.write("</tr>\n"); |
||||
self.wfile.write('</table>'); |
||||
self.wfile.write('</body>') |
||||
self.wfile.write('</html>'); |
||||
chip.state[chanel]=prec |
||||
return |
||||
except IOError: |
||||
self.send_error(404,'Not found') |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
GPIO.cleanup() |
||||
GPIO.setmode(GPIO.BOARD); |
||||
GPIO.setwarnings(True); |
||||
|
||||
CS=13 |
||||
CLK=11 |
||||
MOSI=7 |
||||
MISO=5 |
||||
|
||||
CS=16 |
||||
CLK=12 |
||||
MOSI=10 |
||||
MISO=8 |
||||
print "configuring line pins." |
||||
GPIO.setup(CLK, GPIO.OUT) |
||||
GPIO.setup(MOSI, GPIO.OUT) |
||||
GPIO.setup(MISO, GPIO.IN) |
||||
GPIO.setup(CS, GPIO.OUT) |
||||
|
||||
print "initializing line level." |
||||
GPIO.output(CS, GPIO.HIGH); |
||||
GPIO.output(CLK, GPIO.LOW); |
||||
chip = lightChip(0,CS, CLK, MISO, MOSI) |
||||
|
||||
try: |
||||
server = HTTPServer(('',80), HTTPServ) |
||||
print 'started server' |
||||
server.serve_forever() |
||||
except KeyboardInterrupt: |
||||
server.socket.close() |
||||
GPIO.cleanup() |
Loading…
Reference in new issue