2010/usb10/InstallWindows: rainbow.py

File rainbow.py, 1.7 KB (added by tobi, 7 years ago)

rgb LED + light dependent resistor example program for ATUC3B1256

Line 
1#!/usr/bin/env python
2
3import sys, os
4import array
5import usb
6import colorsys
7import time
8import math
9
10busses = usb.busses()
11
12
13VENDOR = 0x03eb
14PRODUCT = 0x2300
15IFACE = 0
16EP_IN = 0x81
17EP_OUT = 0x02
18
19
20deltah = 0.001
21T = 0.002
22PWMperADC = 10
23
24def get_device():
25    for bus in busses:
26        devices = bus.devices
27        for dev in devices:
28            if dev.idVendor == VENDOR and dev.idProduct == PRODUCT:
29                return dev
30    return None
31
32
33vmax = 1
34vmin = 2**16
35def adc(v):
36    global vmax, vmin
37    if v > vmax: vmax = v
38    if v < vmin: vmin = v
39    if vmax <= vmin: vmin -= 1
40
41    print '#' * int( 80 * (v - vmin) / (vmax - vmin) )
42
43
44usbiocnt = 0
45def usbio(dh, r, g, b):
46    global usbiocnt
47   
48    dout = array.array('B', [0]*4)
49
50    dout[0] = 0xFF & 0x00
51    dout[1] = 0xFF & (r)
52    dout[2] = 0xFF & (g)
53    dout[3] = 0xFF & (b) 
54
55    dh.bulkWrite(EP_OUT, dout.tostring())
56
57
58    if usbiocnt >= PWMperADC:
59        usbiocnt = 0
60
61        din = dh.bulkRead(EP_IN, 4)
62        l = len(din)
63        if l != 4:
64            print "unexpected bulk read length: %d" % l
65        else:
66            adc( (din[2] << 8) + din[3] )
67    else:
68        usbiocnt += 1
69
70
71def intcol(v):
72    v = int(v*256)
73    if v > 255: v = 255
74    if v < 0: v = 0
75    return v
76
77
78def rainbow(dh):
79
80    h = 0.
81    s = 1.
82    v = 1.
83   
84    while 1:
85        if h > 1.:
86            h = 0.
87        else:
88            h += deltah
89
90        rgb = colorsys.hsv_to_rgb(h, s, v)
91        (ri, gi, bi) = map(intcol, rgb)
92
93        usbio(dh, ri, gi, bi)
94
95        time.sleep(T)
96
97 
98def main():
99
100    dev = get_device()
101    dh = dev.open()
102    dh.claimInterface(IFACE)
103
104    rainbow(dh)
105
106    dh.releaseInterface()
107    del dh
108    return 0
109
110
111if __name__ == '__main__':
112    sys.exit( main() )