commit 4d17ecbd5565bea40a850214ac9a563a0dceb254 Author: Stephan Richter Date: Mon Dec 19 14:49:22 2022 +0100 initial commit diff --git a/MCP23S17.py b/MCP23S17.py new file mode 100755 index 0000000..d3d6504 --- /dev/null +++ b/MCP23S17.py @@ -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() diff --git a/README b/README new file mode 100644 index 0000000..774ff46 --- /dev/null +++ b/README @@ -0,0 +1 @@ +Python-basiertes Steuer-Programm für die LED-Matrix diff --git a/lightChip.py b/lightChip.py new file mode 100644 index 0000000..39f7fb9 --- /dev/null +++ b/lightChip.py @@ -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<'); + self.wfile.write(''); + self.wfile.write('') + self.wfile.write(''); + self.wfile.write("\n"); + self.wfile.write("\n"); + for dim in range(0,11): + self.wfile.write("\n"); + for col in range(0,8): + self.wfile.write(''.format(col,dim,(1+col),dim)) + self.wfile.write("\n"); + self.wfile.write('
{}/{}
'); + self.wfile.write('') + self.wfile.write(''); + 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()