Difference between revisions of "Tinkering workshop"
Line 59: | Line 59: | ||
16:15 - 17:00 Play | 16:15 - 17:00 Play | ||
+ | |||
+ | |||
+ | =code= | ||
+ | |||
+ | <syntaxhighlight lang="python" line='line'> | ||
+ | from adafruit_circuitplayground.express import cpx | ||
+ | import board | ||
+ | from adafruit_circuitplayground import cp | ||
+ | import time | ||
+ | import pulseio | ||
+ | import array | ||
+ | import touchio | ||
+ | import digitalio | ||
+ | |||
+ | # change into your own color by changing the rgb value | ||
+ | myID_colour=(0,255,255) | ||
+ | # NeoPixel brightness | ||
+ | |||
+ | # Create IR input, maximum of 59 bits. | ||
+ | pulseIn = pulseio.PulseIn(board.IR_RX, maxlen=59, idle_state=True) | ||
+ | # Clears any artifacts | ||
+ | pulseIn.clear() | ||
+ | pulseIn.resume() | ||
+ | |||
+ | # Creates IR output pulse | ||
+ | pwm = pulseio.PWMOut(board.IR_TX, frequency=38000, duty_cycle=2 ** 15) | ||
+ | pulse = pulseio.PulseOut(pwm) | ||
+ | |||
+ | # Array for button A pulse, this is the pulse output when the button is pressed | ||
+ | # Inputs are compared against this same array | ||
+ | # array.array('H', [x]) must be used for IR pulse arrays when using pulseio | ||
+ | # indented to multiple lines so its easier to see | ||
+ | pulse_A = array.array('H', [1000, 3800, 65000, 950, 300, 200, 300, 1000, 350, 175, | ||
+ | 275, 215, 275, 250, 275, 215, 275, 225, 275, 215, 275, 1000, 300, 225, 275, | ||
+ | 950, 300, 950, 300, 1000, 300, 950, 300, 250, 275, 700, 300, 950, 300, 450, | ||
+ | 300, 475, 300, 215, 275, 725, 300, 950, 300, 200, 300, 715, 325, 900, 315, | ||
+ | 425, 315, 1000, 65000]) | ||
+ | pulse_B = array.array('H', [1000, 3800, 65000, 960, 300, 200, 300, 950, 350, 190, | ||
+ | 215, 245, 300, 225, 275, 225, 275, 215, 275, 200, 300, 700, 300, 200, 300, | ||
+ | 700, 300, 1000, 315, 675, 300, 1000, 300, 200, 300, 700, 300, 950, 300, | ||
+ | 950, 300, 700, 300, 700, 300, 450, 300, 475, 275, 715, 300, 225, 275, 450, | ||
+ | 300, 450, 300, 1000, 65000]) | ||
+ | |||
+ | # Fuzzy pulse comparison function. Fuzzyness is % error | ||
+ | def fuzzy_pulse_compare(pulse1, pulse2, fuzzyness=0.5): | ||
+ | if len(pulse1) != len(pulse2): | ||
+ | return False | ||
+ | for i in range(len(pulse1)): | ||
+ | threshold = int(pulse1[i] * fuzzyness) | ||
+ | if abs(pulse1[i] - pulse2[i]) > threshold: | ||
+ | return False | ||
+ | return True | ||
+ | |||
+ | # Initializes NeoPixel ring | ||
+ | cp.pixels.brightness= 0.2 | ||
+ | # my id color | ||
+ | cp.pixels.fill(myID_colour) | ||
+ | #cp.pixels.show() | ||
+ | |||
+ | # serial print once when activated | ||
+ | print('IR Activated!') | ||
+ | |||
+ | while True: | ||
+ | # when button is pressed, send IR pulse | ||
+ | # detection is paused then cleared and resumed after a short pause | ||
+ | # this prevents reflected detection of own IR | ||
+ | while cp.touch_A3: | ||
+ | pulseIn.pause() # pauses IR detection | ||
+ | pulse.send(pulse_A) # sends IR pulse | ||
+ | time.sleep(.2) # wait so pulses dont run together | ||
+ | pulseIn.clear() # clear any detected pulses to remove partial artifacts | ||
+ | pulseIn.resume() # resumes IR detection | ||
+ | while cp.touch_A4: | ||
+ | pulseIn.pause() | ||
+ | pulse.send(pulse_B) | ||
+ | time.sleep(.2) | ||
+ | pulseIn.clear() | ||
+ | pulseIn.resume() | ||
+ | # Wait for a pulse to be detected of desired length | ||
+ | while len(pulseIn) >= 59: # our array is 59 bytes so anything shorter ignore | ||
+ | pulseIn.pause() | ||
+ | # converts pulseIn raw data into useable array | ||
+ | detected = array.array('H', [pulseIn[x] for x in range(len(pulseIn))]) | ||
+ | # print(len(pulseIn)) | ||
+ | # print(detected) | ||
+ | |||
+ | # Got a pulse, now compare against stored pulse_A and pulse_B | ||
+ | if fuzzy_pulse_compare(pulse_A, detected): | ||
+ | print('Received correct Button A control press!') | ||
+ | t_end = time.monotonic() + 0.8 # saves time 2 seconds in the future | ||
+ | while time.monotonic() < t_end: # plays sparkels until time is up | ||
+ | for x in range(10): | ||
+ | if x!= 0 and x!=2 and x!=4: | ||
+ | cp.pixels[x]=(250, 55, 100) | ||
+ | |||
+ | else: | ||
+ | cp.pixels[x]=(0, 0, 0) | ||
+ | cp.play_file("kiss.wav") | ||
+ | time.sleep(1.5) | ||
+ | cp.pixels.fill(myID_colour) | ||
+ | |||
+ | if fuzzy_pulse_compare(pulse_B, detected): | ||
+ | print('Received correct Button B control press!') | ||
+ | t_end = time.monotonic() + 0.8 | ||
+ | while time.monotonic() < t_end: | ||
+ | #rainbow_cycle(.001) | ||
+ | cp.pixels.fill((255, 0, 0)) | ||
+ | cp.play_file("explosion.wav") | ||
+ | time.sleep(0.5) | ||
+ | cp.pixels.fill(myID_colour) | ||
+ | |||
+ | |||
+ | |||
+ | time.sleep(.1) | ||
+ | pulseIn.clear() | ||
+ | pulseIn.resume() | ||
+ | |||
+ | </syntaxhighlight> |
Revision as of 12:16, 6 April 2021
Yoana:
introduction on Adafruit Circuit Playground Express
install CircuitPython
install mu editor
Interacting to the Serial Console
The REPL
short cuts:
Indentation and commenting options
Python programs are Space holder Character Sensitive.
To indent the three lines, I selected them all and then pressed the Tab key.
To unindent, select some lines and press Shift-Tab. For commenting: select lines and press command(control)-k
http://interactionstation.wdka.hro.nl/wiki/Cpx-basic
Nan==
install library..
examples:
library CircuitPython Made Easy
1. Smiley face with NeoPixels
2. Capacitive Touch & NeoPixels
3. Play audio file
4. Drum machine
5. final infrared tagging games(maybe)
timing / schedule
start 13:00 end 17:00
13:00 - 14:00 Yoana introduction part
14:00 - 14:15 - break
14:15 - 16:00 Nan's part
16:00 - 16:15 break
16:15 - 17:00 Play
code
1from adafruit_circuitplayground.express import cpx
2import board
3from adafruit_circuitplayground import cp
4import time
5import pulseio
6import array
7import touchio
8import digitalio
9
10# change into your own color by changing the rgb value
11myID_colour=(0,255,255)
12# NeoPixel brightness
13
14# Create IR input, maximum of 59 bits.
15pulseIn = pulseio.PulseIn(board.IR_RX, maxlen=59, idle_state=True)
16# Clears any artifacts
17pulseIn.clear()
18pulseIn.resume()
19
20# Creates IR output pulse
21pwm = pulseio.PWMOut(board.IR_TX, frequency=38000, duty_cycle=2 ** 15)
22pulse = pulseio.PulseOut(pwm)
23
24# Array for button A pulse, this is the pulse output when the button is pressed
25# Inputs are compared against this same array
26# array.array('H', [x]) must be used for IR pulse arrays when using pulseio
27# indented to multiple lines so its easier to see
28pulse_A = array.array('H', [1000, 3800, 65000, 950, 300, 200, 300, 1000, 350, 175,
29 275, 215, 275, 250, 275, 215, 275, 225, 275, 215, 275, 1000, 300, 225, 275,
30 950, 300, 950, 300, 1000, 300, 950, 300, 250, 275, 700, 300, 950, 300, 450,
31 300, 475, 300, 215, 275, 725, 300, 950, 300, 200, 300, 715, 325, 900, 315,
32 425, 315, 1000, 65000])
33pulse_B = array.array('H', [1000, 3800, 65000, 960, 300, 200, 300, 950, 350, 190,
34 215, 245, 300, 225, 275, 225, 275, 215, 275, 200, 300, 700, 300, 200, 300,
35 700, 300, 1000, 315, 675, 300, 1000, 300, 200, 300, 700, 300, 950, 300,
36 950, 300, 700, 300, 700, 300, 450, 300, 475, 275, 715, 300, 225, 275, 450,
37 300, 450, 300, 1000, 65000])
38
39# Fuzzy pulse comparison function. Fuzzyness is % error
40def fuzzy_pulse_compare(pulse1, pulse2, fuzzyness=0.5):
41 if len(pulse1) != len(pulse2):
42 return False
43 for i in range(len(pulse1)):
44 threshold = int(pulse1[i] * fuzzyness)
45 if abs(pulse1[i] - pulse2[i]) > threshold:
46 return False
47 return True
48
49# Initializes NeoPixel ring
50cp.pixels.brightness= 0.2
51# my id color
52cp.pixels.fill(myID_colour)
53#cp.pixels.show()
54
55# serial print once when activated
56print('IR Activated!')
57
58while True:
59# when button is pressed, send IR pulse
60# detection is paused then cleared and resumed after a short pause
61# this prevents reflected detection of own IR
62 while cp.touch_A3:
63 pulseIn.pause() # pauses IR detection
64 pulse.send(pulse_A) # sends IR pulse
65 time.sleep(.2) # wait so pulses dont run together
66 pulseIn.clear() # clear any detected pulses to remove partial artifacts
67 pulseIn.resume() # resumes IR detection
68 while cp.touch_A4:
69 pulseIn.pause()
70 pulse.send(pulse_B)
71 time.sleep(.2)
72 pulseIn.clear()
73 pulseIn.resume()
74# Wait for a pulse to be detected of desired length
75 while len(pulseIn) >= 59: # our array is 59 bytes so anything shorter ignore
76 pulseIn.pause()
77# converts pulseIn raw data into useable array
78 detected = array.array('H', [pulseIn[x] for x in range(len(pulseIn))])
79# print(len(pulseIn))
80# print(detected)
81
82 # Got a pulse, now compare against stored pulse_A and pulse_B
83 if fuzzy_pulse_compare(pulse_A, detected):
84 print('Received correct Button A control press!')
85 t_end = time.monotonic() + 0.8 # saves time 2 seconds in the future
86 while time.monotonic() < t_end: # plays sparkels until time is up
87 for x in range(10):
88 if x!= 0 and x!=2 and x!=4:
89 cp.pixels[x]=(250, 55, 100)
90
91 else:
92 cp.pixels[x]=(0, 0, 0)
93 cp.play_file("kiss.wav")
94 time.sleep(1.5)
95 cp.pixels.fill(myID_colour)
96
97 if fuzzy_pulse_compare(pulse_B, detected):
98 print('Received correct Button B control press!')
99 t_end = time.monotonic() + 0.8
100 while time.monotonic() < t_end:
101 #rainbow_cycle(.001)
102 cp.pixels.fill((255, 0, 0))
103 cp.play_file("explosion.wav")
104 time.sleep(0.5)
105 cp.pixels.fill(myID_colour)
106
107
108
109 time.sleep(.1)
110 pulseIn.clear()
111 pulseIn.resume()