Difference between revisions of "Tinkering workshop"

From Interaction Station Wiki
Jump to navigation Jump to search
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 13: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()