commit
4d17ecbd55
4 changed files with 360 additions and 0 deletions
@ -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,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 @@ |
|||||||
|
#!/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