diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..0d20b648 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/Adafruit_PWM_Servo_Driver/Adafruit_I2C.py b/Adafruit_PWM_Servo_Driver/Adafruit_I2C.py index dd2dfa76..53456c73 100755 --- a/Adafruit_PWM_Servo_Driver/Adafruit_I2C.py +++ b/Adafruit_PWM_Servo_Driver/Adafruit_I2C.py @@ -8,9 +8,9 @@ class Adafruit_I2C : - def __init__(self, address, bus=smbus.SMBus(0), debug=False): + def __init__(self, address, bus=0, debug=False): self.address = address - self.bus = bus + self.bus = smbus.SMBus(bus) self.debug = debug def reverseByteOrder(self, data): diff --git a/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py b/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py index 76ab5137..93af640b 100644 --- a/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py +++ b/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py @@ -26,8 +26,8 @@ class PWM : __ALLLED_OFF_L = 0xFC __ALLLED_OFF_H = 0xFD - def __init__(self, address=0x40, debug=False): - self.i2c = Adafruit_I2C(address) + def __init__(self, address=0x40, debug=False, bus=0): + self.i2c = Adafruit_I2C(address, bus) self.address = address self.debug = debug if (self.debug): diff --git a/Adafruit_PWM_Servo_Driver/LEDDriver.py b/Adafruit_PWM_Servo_Driver/LEDDriver.py new file mode 100644 index 00000000..2deae01a --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/LEDDriver.py @@ -0,0 +1,52 @@ +#!/usr/bin/python + +from Adafruit_PWM_Servo_Driver import PWM +import time +from RGBDevice import RGBDevice +import tornado.ioloop +import tornado.web +import tornado.websocket +import json +from Show import Automatic + +# Initialise the PWM device using the default address +pwm = PWM(0x40, debug=True) + +pwm.setPWMFreq(1600) # Set frequency to 600 Hz + +devices = [ + RGBDevice(pwm, 0), + RGBDevice(pwm, 3) +] + +automatic = None + +class LEDWebSocket(tornado.websocket.WebSocketHandler): + def open(self): + pass + def on_message(self, message): + val = json.loads(str(message)) + if 'auto' in val: + if val['auto']: + global automatic + if automatic is not None and automatic.isAlive(): return + automatic = Automatic(devices) + automatic.start() + else: + if automatic is None: return + automatic.stop() + return + for key in val: + val[key] *= 40.95 + for device in devices: + device.setChannels(val) + def on_close(self): + pass + +app = tornado.web.Application([ + (r"/socket", LEDWebSocket) +]) + +if __name__ == "__main__": + app.listen(8080) + tornado.ioloop.IOLoop.instance().start() diff --git a/Adafruit_PWM_Servo_Driver/RGBDevice.py b/Adafruit_PWM_Servo_Driver/RGBDevice.py new file mode 100644 index 00000000..666e8d72 --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/RGBDevice.py @@ -0,0 +1,44 @@ +import time + +class RGBDevice: + def __init__(self, pwm, baseAddress): + self.pwm = pwm + self.baseAddress = baseAddress + self.master = 1 + # mapping of channel names against PWM channels + self.channelMap = { + 'red' : self.baseAddress + 1, + 'green' : self.baseAddress + 2, + 'blue' : self.baseAddress + 0 + } + # reset to 0 + self.values = {'red':0, 'green':0, 'blue':0} + self.setChannels(self.values) + + def setChannels(self, values): + for color in values: + if not color in self.channelMap: continue + self.pwm.setPWM(self.channelMap[color], 0, self.lightnessCorrect(int(values[color] * self.master))) + self.values[color] = values[color] + + def lightnessCorrect(self, value): + return int(round(4095.0 * (value / 4095.0) ** 2.2)) + + def fadeTo(self, values, stepSize = 1, sleep = .01): + maxDelta = 0 + directions = {} + for key in values: + if not key in self.values: continue + delta = values[key] - self.values[key] + maxDelta = max(maxDelta, abs(delta)) + directions[key] = 1 if delta > 0 else -1 + for i in range(0, maxDelta / stepSize): + iteration = {} + for key in values: + if (self.values[key] + stepSize * directions[key]) * directions[key] > values[key] * directions[key]: + iteration[key] = values[key] + else: + iteration[key] = self.values[key] + stepSize * directions[key] + self.setChannels(iteration) + time.sleep(sleep) + self.setChannels(values) diff --git a/Adafruit_PWM_Servo_Driver/Servo_Example.py b/Adafruit_PWM_Servo_Driver/Servo_Example.py deleted file mode 100644 index 47527429..00000000 --- a/Adafruit_PWM_Servo_Driver/Servo_Example.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/python - -from Adafruit_PWM_Servo_Driver import PWM -import time - -# =========================================================================== -# Example Code -# =========================================================================== - -# Initialise the PWM device using the default address -# bmp = PWM(0x40, debug=True) -pwm = PWM(0x40, debug=True) - -servoMin = 150 # Min pulse length out of 4096 -servoMax = 600 # Max pulse length out of 4096 - -def setServoPulse(channel, pulse): - pulseLength = 1000000 # 1,000,000 us per second - pulseLength /= 60 # 60 Hz - print "%d us per period" % pulseLength - pulseLength /= 4096 # 12 bits of resolution - print "%d us per bit" % pulseLength - pulse *= 1000 - pulse /= pulseLength - pwm.setPWM(channel, 0, pulse) - -pwm.setPWMFreq(60) # Set frequency to 60 Hz -while (True): - # Change speed of continuous servo on channel O - pwm.setPWM(0, 0, servoMin) - time.sleep(1) - pwm.setPWM(0, 0, servoMax) - time.sleep(1) - - - diff --git a/Adafruit_PWM_Servo_Driver/Show.py b/Adafruit_PWM_Servo_Driver/Show.py new file mode 100644 index 00000000..045136a4 --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/Show.py @@ -0,0 +1,47 @@ +import time +import threading + +pattern = [ + {'red':4095}, + {'red':0, 'green':4095}, + {'green':0, 'blue':4095}, + {'blue':0, 'red':4095}, + {'green':4095}, + {'red':0}, + {'blue':4095}, + {'green':0}, + {'red':4095}, + {'blue':0}, + {'green':4095, 'blue':4095}, + {'green':0}, + {'green':4095}, + {'blue':0}, + {'blue':4095}, + {'red':0}, + {'red':0, 'green':0, 'blue':0} +] + +#while (True): + + +class Automatic(threading.Thread): + def __init__(self, devices): + self.doStop = False + self.devices = devices + threading.Thread.__init__(self) + + def setChannels(self, values): + for device in self.devices: + device.setChannels(values) + + def run(self): + self.setChannels({'red':0,'blue':0,'green':0}) + while not self.doStop: + for value in pattern: + if not self.doStop: + self.devices[0].fadeTo(value) + time.sleep(1) + self.setChannels({'red':0,'blue':0,'green':0}) + + def stop(self): + self.doStop = True diff --git a/Adafruit_PWM_Servo_Driver/sound-test.py b/Adafruit_PWM_Servo_Driver/sound-test.py new file mode 100644 index 00000000..c9decfcb --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/sound-test.py @@ -0,0 +1,49 @@ +from Adafruit_PWM_Servo_Driver import PWM + +import alsaaudio +import struct, numpy, threading, time + +input = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, 'hw:1,0') +print input.cardname() +input.setformat(alsaaudio.PCM_FORMAT_S16_LE) +input.setrate(48000) +input.setchannels(2) +input.setperiodsize(1024) + +# Initialise the PWM device using the default address +pwm = PWM(0x40, debug=True) + +pwm.setPWMFreq(1600) # Set frequency to 600 Hz + +data = None +l = 0 + +def readAudio(): + global data, l + while True: + l, data = input.read() + +reader = threading.Thread(target=readAudio) +reader.start() + +while True: + #readAudio() + #l, data = input.read() + if l <= 0 : continue + + format = '<%dH' % (l * 2) + data = numpy.array(struct.unpack(format, data), dtype='h') + try: + output = numpy.fft.fft(data, 10) + freqs = numpy.fft.fftfreq(len(output)) * 48000 + + ffty = numpy.abs(output[0:len(output)/2])/1000 + ret = [] + for val in ffty: + ret.append(round(val, 3)) + + for i, val in enumerate(ret): + pwm.setPWM(i, 0, int(val * 10)) + + except IndexError: + pass