initial commit
This commit is contained in:
126
MCP23S17.py
Executable file
126
MCP23S17.py
Executable file
@@ -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()
|
||||
163
lightChip.py
Normal file
163
lightChip.py
Normal file
@@ -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()
|
||||
70
lightsaber.py
Executable file
70
lightsaber.py
Executable file
@@ -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()
|
||||
Reference in New Issue
Block a user