From d266f1f18d4356db40e23ac53aa38dc0a5b461eb Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 25 Oct 2012 20:40:05 +0200 Subject: [PATCH 01/13] modifying the PWM example to drive LEDs --- Adafruit_PWM_Servo_Driver/Servo_Example.py | 52 ++++++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/Adafruit_PWM_Servo_Driver/Servo_Example.py b/Adafruit_PWM_Servo_Driver/Servo_Example.py index 47527429..57e59d48 100644 --- a/Adafruit_PWM_Servo_Driver/Servo_Example.py +++ b/Adafruit_PWM_Servo_Driver/Servo_Example.py @@ -11,9 +11,6 @@ # 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 @@ -24,13 +21,50 @@ def setServoPulse(channel, pulse): pulse /= pulseLength pwm.setPWM(channel, 0, pulse) -pwm.setPWMFreq(60) # Set frequency to 60 Hz +pwm.setPWMFreq(600) # Set frequency to 60 Hz + +master = 1 + +def setColor(red, green, blue): + #print(str(red) + ', ' + str(green) + ', ' + str(blue)) + pwm.setPWM(1, 0, int(red * master)) + pwm.setPWM(2, 0, int(green * master)) + pwm.setPWM(0, 0, int(blue * master)) + +def sleep(): + time.sleep(.01) + +stepSize = 1 + while (True): - # Change speed of continuous servo on channel O - pwm.setPWM(0, 0, servoMin) + for red in range(0, 4095, stepSize): + setColor(red, 0, 0) + sleep() + setColor(4095, 0, 0) time.sleep(1) - pwm.setPWM(0, 0, servoMax) + for green in range(0, 4095, stepSize): + setColor(4095-green, green, 0) + sleep() + setColor(0, 4095, 0) + time.sleep(1) + for blue in range(0, 4095, stepSize): + setColor(0, 4095-blue, blue) + sleep() + setColor(0, 0, 4095) + time.sleep(1) + for red in range(0, 4095, stepSize): + setColor(red, 0, 4095-red) + sleep() + setColor(4095, 0, 0) + time.sleep(1) + for white in range(0, 4095, stepSize): + setColor(4095, white, white) + sleep() + setColor(4095, 4095, 4095) + time.sleep(1) + for white in range(0, 4095, stepSize): + setColor(4095-white, 4095-white, 4095-white) + sleep() + setColor(0, 0, 0) time.sleep(1) - - From 166ecfb9f17f654c754bf1afefc7bf1a645315fc Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 25 Oct 2012 20:42:03 +0200 Subject: [PATCH 02/13] remove obosolete code --- Adafruit_PWM_Servo_Driver/Servo_Example.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Adafruit_PWM_Servo_Driver/Servo_Example.py b/Adafruit_PWM_Servo_Driver/Servo_Example.py index 57e59d48..ecfe43f6 100644 --- a/Adafruit_PWM_Servo_Driver/Servo_Example.py +++ b/Adafruit_PWM_Servo_Driver/Servo_Example.py @@ -11,16 +11,6 @@ # bmp = PWM(0x40, debug=True) pwm = PWM(0x40, debug=True) -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(600) # Set frequency to 60 Hz master = 1 From b288c100426ed53b730aa9cdb1dc292b87a5805f Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 25 Oct 2012 20:43:30 +0200 Subject: [PATCH 03/13] remove more unused code --- Adafruit_PWM_Servo_Driver/Servo_Example.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Adafruit_PWM_Servo_Driver/Servo_Example.py b/Adafruit_PWM_Servo_Driver/Servo_Example.py index ecfe43f6..d376c75b 100644 --- a/Adafruit_PWM_Servo_Driver/Servo_Example.py +++ b/Adafruit_PWM_Servo_Driver/Servo_Example.py @@ -3,15 +3,10 @@ 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) -pwm.setPWMFreq(600) # Set frequency to 60 Hz +pwm.setPWMFreq(600) # Set frequency to 600 Hz master = 1 From 3607353c3ad941a0382342489e57bc53788b68fa Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 25 Oct 2012 20:44:29 +0200 Subject: [PATCH 04/13] rename file --- Adafruit_PWM_Servo_Driver/{Servo_Example.py => LEDDriver.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Adafruit_PWM_Servo_Driver/{Servo_Example.py => LEDDriver.py} (100%) diff --git a/Adafruit_PWM_Servo_Driver/Servo_Example.py b/Adafruit_PWM_Servo_Driver/LEDDriver.py similarity index 100% rename from Adafruit_PWM_Servo_Driver/Servo_Example.py rename to Adafruit_PWM_Servo_Driver/LEDDriver.py From 2549dd369f8ef0bf1665077680754b95ba66051a Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 25 Oct 2012 21:39:56 +0200 Subject: [PATCH 05/13] splitting a part into separate files & use the OOP approach --- Adafruit_PWM_Servo_Driver/LEDDriver.py | 33 +++++++++++--------------- Adafruit_PWM_Servo_Driver/RGBDevice.py | 10 ++++++++ 2 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 Adafruit_PWM_Servo_Driver/RGBDevice.py diff --git a/Adafruit_PWM_Servo_Driver/LEDDriver.py b/Adafruit_PWM_Servo_Driver/LEDDriver.py index d376c75b..2b54145a 100644 --- a/Adafruit_PWM_Servo_Driver/LEDDriver.py +++ b/Adafruit_PWM_Servo_Driver/LEDDriver.py @@ -2,19 +2,14 @@ from Adafruit_PWM_Servo_Driver import PWM import time +from RGBDevice import RGBDevice # Initialise the PWM device using the default address pwm = PWM(0x40, debug=True) pwm.setPWMFreq(600) # Set frequency to 600 Hz -master = 1 - -def setColor(red, green, blue): - #print(str(red) + ', ' + str(green) + ', ' + str(blue)) - pwm.setPWM(1, 0, int(red * master)) - pwm.setPWM(2, 0, int(green * master)) - pwm.setPWM(0, 0, int(blue * master)) +device = RGBDevice(pwm, 0) def sleep(): time.sleep(.01) @@ -23,33 +18,33 @@ def sleep(): while (True): for red in range(0, 4095, stepSize): - setColor(red, 0, 0) + device.setRGB(red, 0, 0) sleep() - setColor(4095, 0, 0) + device.setRGB(4095, 0, 0) time.sleep(1) for green in range(0, 4095, stepSize): - setColor(4095-green, green, 0) + device.setRGB(4095-green, green, 0) sleep() - setColor(0, 4095, 0) + device.setRGB(0, 4095, 0) time.sleep(1) for blue in range(0, 4095, stepSize): - setColor(0, 4095-blue, blue) + device.setRGB(0, 4095-blue, blue) sleep() - setColor(0, 0, 4095) + device.setRGB(0, 0, 4095) time.sleep(1) for red in range(0, 4095, stepSize): - setColor(red, 0, 4095-red) + device.setRGB(red, 0, 4095-red) sleep() - setColor(4095, 0, 0) + device.setRGB(4095, 0, 0) time.sleep(1) for white in range(0, 4095, stepSize): - setColor(4095, white, white) + device.setRGB(4095, white, white) sleep() - setColor(4095, 4095, 4095) + device.setRGB(4095, 4095, 4095) time.sleep(1) for white in range(0, 4095, stepSize): - setColor(4095-white, 4095-white, 4095-white) + device.setRGB(4095-white, 4095-white, 4095-white) sleep() - setColor(0, 0, 0) + device.setRGB(0, 0, 0) time.sleep(1) diff --git a/Adafruit_PWM_Servo_Driver/RGBDevice.py b/Adafruit_PWM_Servo_Driver/RGBDevice.py new file mode 100644 index 00000000..d616eb0b --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/RGBDevice.py @@ -0,0 +1,10 @@ +class RGBDevice: + def __init__(self, pwm, baseAddress): + self.pwm = pwm + self.baseAddress = baseAddress + self.master = 1 + + def setRGB(self, red, green, blue): + self.pwm.setPWM(self.baseAddress + 1, 0, int(red * self.master)) + self.pwm.setPWM(self.baseAddress + 2, 0, int(green * self.master)) + self.pwm.setPWM(self.baseAddress + 0, 0, int(blue * self.master)) From 7c791e13b13b9a9262ed684f100ebcde0178f7a3 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 26 Oct 2012 21:42:36 +0200 Subject: [PATCH 06/13] implement fading and make programming sequences super-easy --- Adafruit_PWM_Servo_Driver/LEDDriver.py | 61 ++++++++++---------------- Adafruit_PWM_Servo_Driver/RGBDevice.py | 37 ++++++++++++++-- 2 files changed, 57 insertions(+), 41 deletions(-) diff --git a/Adafruit_PWM_Servo_Driver/LEDDriver.py b/Adafruit_PWM_Servo_Driver/LEDDriver.py index 2b54145a..115ec974 100644 --- a/Adafruit_PWM_Servo_Driver/LEDDriver.py +++ b/Adafruit_PWM_Servo_Driver/LEDDriver.py @@ -11,40 +11,27 @@ device = RGBDevice(pwm, 0) -def sleep(): - time.sleep(.01) - -stepSize = 1 - -while (True): - for red in range(0, 4095, stepSize): - device.setRGB(red, 0, 0) - sleep() - device.setRGB(4095, 0, 0) - time.sleep(1) - for green in range(0, 4095, stepSize): - device.setRGB(4095-green, green, 0) - sleep() - device.setRGB(0, 4095, 0) - time.sleep(1) - for blue in range(0, 4095, stepSize): - device.setRGB(0, 4095-blue, blue) - sleep() - device.setRGB(0, 0, 4095) - time.sleep(1) - for red in range(0, 4095, stepSize): - device.setRGB(red, 0, 4095-red) - sleep() - device.setRGB(4095, 0, 0) - time.sleep(1) - for white in range(0, 4095, stepSize): - device.setRGB(4095, white, white) - sleep() - device.setRGB(4095, 4095, 4095) - time.sleep(1) - for white in range(0, 4095, stepSize): - device.setRGB(4095-white, 4095-white, 4095-white) - sleep() - device.setRGB(0, 0, 0) - time.sleep(1) - +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): + for value in pattern: + device.fadeTo(value) + time.sleep(1) diff --git a/Adafruit_PWM_Servo_Driver/RGBDevice.py b/Adafruit_PWM_Servo_Driver/RGBDevice.py index d616eb0b..d93eb3be 100644 --- a/Adafruit_PWM_Servo_Driver/RGBDevice.py +++ b/Adafruit_PWM_Servo_Driver/RGBDevice.py @@ -1,10 +1,39 @@ +import time + class RGBDevice: def __init__(self, pwm, baseAddress): self.pwm = pwm self.baseAddress = baseAddress self.master = 1 + self.values = {'red':0, 'green':0, 'blue':0} + self.setChannels(self.values) + + def setChannels(self, values): + if 'red' in values: + self.pwm.setPWM(self.baseAddress + 1, 0, int(values['red'] * self.master)) + self.values['red'] = values['red'] + if 'green' in values: + self.pwm.setPWM(self.baseAddress + 2, 0, int(values['green'] * self.master)) + self.values['green'] = values['green'] + if 'blue' in values: + self.pwm.setPWM(self.baseAddress + 0, 0, int(values['blue'] * self.master)) + self.values['blue'] = values['blue'] - def setRGB(self, red, green, blue): - self.pwm.setPWM(self.baseAddress + 1, 0, int(red * self.master)) - self.pwm.setPWM(self.baseAddress + 2, 0, int(green * self.master)) - self.pwm.setPWM(self.baseAddress + 0, 0, int(blue * self.master)) + 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) From bfd2f78d880afdbebbebd0791e81eae26de627ec Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 30 Oct 2012 06:24:30 +0100 Subject: [PATCH 07/13] enable websocket control --- Adafruit_PWM_Servo_Driver/LEDDriver.py | 31 ++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/Adafruit_PWM_Servo_Driver/LEDDriver.py b/Adafruit_PWM_Servo_Driver/LEDDriver.py index 115ec974..131f34eb 100644 --- a/Adafruit_PWM_Servo_Driver/LEDDriver.py +++ b/Adafruit_PWM_Servo_Driver/LEDDriver.py @@ -3,6 +3,10 @@ from Adafruit_PWM_Servo_Driver import PWM import time from RGBDevice import RGBDevice +import tornado.ioloop +import tornado.web +import tornado.websocket +import json # Initialise the PWM device using the default address pwm = PWM(0x40, debug=True) @@ -31,7 +35,26 @@ {'red':0, 'green':0, 'blue':0} ] -while (True): - for value in pattern: - device.fadeTo(value) - time.sleep(1) +#while (True): +# for value in pattern: +# device.fadeTo(value) +# time.sleep(1) + +class LEDWebSocket(tornado.websocket.WebSocketHandler): + def open(self): + pass + def on_message(self, message): + val = json.loads(str(message)) + for key in val: + val[key] *= 40.95 + 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() From ac6a4b2c1e7a0db104461735a5a6c0d630b25c82 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 30 Oct 2012 21:09:11 +0100 Subject: [PATCH 08/13] adding automatic show playback in a thread --- Adafruit_PWM_Servo_Driver/LEDDriver.py | 33 ++++++-------------- Adafruit_PWM_Servo_Driver/Show.py | 42 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 Adafruit_PWM_Servo_Driver/Show.py diff --git a/Adafruit_PWM_Servo_Driver/LEDDriver.py b/Adafruit_PWM_Servo_Driver/LEDDriver.py index 131f34eb..0b6a32a0 100644 --- a/Adafruit_PWM_Servo_Driver/LEDDriver.py +++ b/Adafruit_PWM_Servo_Driver/LEDDriver.py @@ -7,6 +7,7 @@ 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) @@ -15,36 +16,20 @@ device = RGBDevice(pwm, 0) -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): -# for value in pattern: -# device.fadeTo(value) -# time.sleep(1) +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']: + automatic = Automatic(device) + automatic.start() + else: + automatic.stop() + return for key in val: val[key] *= 40.95 device.setChannels(val) diff --git a/Adafruit_PWM_Servo_Driver/Show.py b/Adafruit_PWM_Servo_Driver/Show.py new file mode 100644 index 00000000..4d9328ba --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/Show.py @@ -0,0 +1,42 @@ +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, device): + self.doStop = False + self.device = device + threading.Thread.__init__(self) + + def run(self): + self.device.setChannels({'red':0,'blue':0,'green':0}) + while not self.doStop: + for value in pattern: + if not self.doStop: + self.device.fadeTo(value) + time.sleep(1) + + def stop(self): + self.doStop = True From 8547ca6b8bacb44c7fef5fec6c990903b054fcce Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 1 Nov 2012 00:17:55 +0100 Subject: [PATCH 09/13] fix turning off the automatic mode --- Adafruit_PWM_Servo_Driver/LEDDriver.py | 3 +++ Adafruit_PWM_Servo_Driver/Show.py | 1 + 2 files changed, 4 insertions(+) diff --git a/Adafruit_PWM_Servo_Driver/LEDDriver.py b/Adafruit_PWM_Servo_Driver/LEDDriver.py index 0b6a32a0..a23435c2 100644 --- a/Adafruit_PWM_Servo_Driver/LEDDriver.py +++ b/Adafruit_PWM_Servo_Driver/LEDDriver.py @@ -25,9 +25,12 @@ 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(device) automatic.start() else: + if automatic is None: return automatic.stop() return for key in val: diff --git a/Adafruit_PWM_Servo_Driver/Show.py b/Adafruit_PWM_Servo_Driver/Show.py index 4d9328ba..42100183 100644 --- a/Adafruit_PWM_Servo_Driver/Show.py +++ b/Adafruit_PWM_Servo_Driver/Show.py @@ -37,6 +37,7 @@ def run(self): if not self.doStop: self.device.fadeTo(value) time.sleep(1) + self.device.setChannels({'red':0,'blue':0,'green':0}) def stop(self): self.doStop = True From c6365aa71b2b8bf441a902c2d49d08d4d0750844 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 6 Nov 2012 21:01:50 +0100 Subject: [PATCH 10/13] various changes, experiments for a complete lighting system integration (incl. sound2light) --- Adafruit_PWM_Servo_Driver/LEDDriver.py | 12 ++++-- Adafruit_PWM_Servo_Driver/RGBDevice.py | 23 +++++++----- Adafruit_PWM_Servo_Driver/Show.py | 14 ++++--- Adafruit_PWM_Servo_Driver/sound-test.py | 49 +++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 18 deletions(-) create mode 100644 Adafruit_PWM_Servo_Driver/sound-test.py diff --git a/Adafruit_PWM_Servo_Driver/LEDDriver.py b/Adafruit_PWM_Servo_Driver/LEDDriver.py index a23435c2..2deae01a 100644 --- a/Adafruit_PWM_Servo_Driver/LEDDriver.py +++ b/Adafruit_PWM_Servo_Driver/LEDDriver.py @@ -12,9 +12,12 @@ # Initialise the PWM device using the default address pwm = PWM(0x40, debug=True) -pwm.setPWMFreq(600) # Set frequency to 600 Hz +pwm.setPWMFreq(1600) # Set frequency to 600 Hz -device = RGBDevice(pwm, 0) +devices = [ + RGBDevice(pwm, 0), + RGBDevice(pwm, 3) +] automatic = None @@ -27,7 +30,7 @@ def on_message(self, message): if val['auto']: global automatic if automatic is not None and automatic.isAlive(): return - automatic = Automatic(device) + automatic = Automatic(devices) automatic.start() else: if automatic is None: return @@ -35,7 +38,8 @@ def on_message(self, message): return for key in val: val[key] *= 40.95 - device.setChannels(val) + for device in devices: + device.setChannels(val) def on_close(self): pass diff --git a/Adafruit_PWM_Servo_Driver/RGBDevice.py b/Adafruit_PWM_Servo_Driver/RGBDevice.py index d93eb3be..666e8d72 100644 --- a/Adafruit_PWM_Servo_Driver/RGBDevice.py +++ b/Adafruit_PWM_Servo_Driver/RGBDevice.py @@ -5,19 +5,24 @@ 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): - if 'red' in values: - self.pwm.setPWM(self.baseAddress + 1, 0, int(values['red'] * self.master)) - self.values['red'] = values['red'] - if 'green' in values: - self.pwm.setPWM(self.baseAddress + 2, 0, int(values['green'] * self.master)) - self.values['green'] = values['green'] - if 'blue' in values: - self.pwm.setPWM(self.baseAddress + 0, 0, int(values['blue'] * self.master)) - self.values['blue'] = values['blue'] + 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 diff --git a/Adafruit_PWM_Servo_Driver/Show.py b/Adafruit_PWM_Servo_Driver/Show.py index 42100183..045136a4 100644 --- a/Adafruit_PWM_Servo_Driver/Show.py +++ b/Adafruit_PWM_Servo_Driver/Show.py @@ -25,19 +25,23 @@ class Automatic(threading.Thread): - def __init__(self, device): + def __init__(self, devices): self.doStop = False - self.device = device + self.devices = devices threading.Thread.__init__(self) + def setChannels(self, values): + for device in self.devices: + device.setChannels(values) + def run(self): - self.device.setChannels({'red':0,'blue':0,'green':0}) + self.setChannels({'red':0,'blue':0,'green':0}) while not self.doStop: for value in pattern: if not self.doStop: - self.device.fadeTo(value) + self.devices[0].fadeTo(value) time.sleep(1) - self.device.setChannels({'red':0,'blue':0,'green':0}) + 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 From a2b82e3f363c24ff772ea0a69032f63fe5a3fec0 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 3 Dec 2012 21:03:22 +0100 Subject: [PATCH 11/13] allow the bus to be switch externally --- Adafruit_PWM_Servo_Driver/Adafruit_I2C.py | 4 ++-- Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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): From bfaa9d6fad5ec3744ed2c16bc493ceece8bec1c0 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 3 Dec 2012 21:36:38 +0100 Subject: [PATCH 12/13] allow the bus to be set on init --- Adafruit_PWM_Servo_Driver/Adafruit_I2C.py | 4 ++-- Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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): From b9bf869b7deeee64a7cafcb3c271164dc9719056 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 3 Dec 2012 21:39:13 +0100 Subject: [PATCH 13/13] ignore compiled python files --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..0d20b648 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc