From 382a10081fc46cc241cf3fb6592b4c7fa53892d0 Mon Sep 17 00:00:00 2001 From: BlitzCityDIY Date: Tue, 22 Mar 2022 09:48:19 -0400 Subject: [PATCH] Adding code for Pi Video Synth Adding Blinka code, Processing code and two .png files for the Raspberry Pi Video Synth Learn Guide --- .../BlinkaRaspberryPiVideoSynth.py | 141 ++++++++++ .../ProcessingRaspberryPiVideoSynth.pde | 261 ++++++++++++++++++ Raspberry_Pi_Video_Synth/cat.png | Bin 0 -> 18296 bytes Raspberry_Pi_Video_Synth/pizza.png | Bin 0 -> 10590 bytes 4 files changed, 402 insertions(+) create mode 100644 Raspberry_Pi_Video_Synth/BlinkaRaspberryPiVideoSynth.py create mode 100644 Raspberry_Pi_Video_Synth/ProcessingRaspberryPiVideoSynth.pde create mode 100644 Raspberry_Pi_Video_Synth/cat.png create mode 100644 Raspberry_Pi_Video_Synth/pizza.png diff --git a/Raspberry_Pi_Video_Synth/BlinkaRaspberryPiVideoSynth.py b/Raspberry_Pi_Video_Synth/BlinkaRaspberryPiVideoSynth.py new file mode 100644 index 000000000..fe1916eb5 --- /dev/null +++ b/Raspberry_Pi_Video_Synth/BlinkaRaspberryPiVideoSynth.py @@ -0,0 +1,141 @@ +# SPDX-FileCopyrightText: 2022 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import socket +import time +import board +import simpleio +import adafruit_vl53l4cd +from adafruit_seesaw import seesaw, rotaryio, neopixel +from adafruit_seesaw.analoginput import AnalogInput + +# VL53L4CD setup +vl53 = adafruit_vl53l4cd.VL53L4CD(board.I2C()) + +# rotary encoder setup +encoder = seesaw.Seesaw(board.I2C(), addr=0x36) +encoder.pin_mode(24, encoder.INPUT_PULLUP) +rot_encoder = rotaryio.IncrementalEncoder(encoder) + +# neoslider setup - analog slide pot and neopixel +# 0x30 = red control +# 0x31 = green control +# 0x32 = blue control +red_slider = seesaw.Seesaw(board.I2C(), 0x30) +red_pot = AnalogInput(red_slider, 18) +r_pix = neopixel.NeoPixel(red_slider, 14, 4) + +g_slider = seesaw.Seesaw(board.I2C(), 0x31) +green_pot = AnalogInput(g_slider, 18) +g_pix = neopixel.NeoPixel(g_slider, 14, 4) + +b_slider = seesaw.Seesaw(board.I2C(), 0x32) +blue_pot = AnalogInput(b_slider, 18) +b_pix = neopixel.NeoPixel(b_slider, 14, 4) + +# rotary encoder position tracker +last_position = 0 + +# neoslider position trackers +last_r = 0 +last_g = 0 +last_b = 0 + +# VL53L4CD value tracker +last_flight = 0 + +# rotary encoder index +x = 0 + +# VL53L4CD start-up +vl53.inter_measurement = 0 +vl53.timing_budget = 200 + +vl53.start_ranging() + +# HTTP socket setup +s = socket.socket() +print("socket check") + +port = 12345 + +s.bind(('', port)) +print("socket binded to %s" %(port)) + +s.listen(1) +print("listening") + +time.sleep(10) + +c, addr = s.accept() +print('got connected', addr) + +while True: + # rotary encoder position read + position = -rot_encoder.position + + # VL53L4CD distance read + flight = vl53.distance + + # mapping neosliders to use 0-255 range for RGB values in Processing + r_mapped = simpleio.map_range(red_pot.value, 0, 1023, 0, 255) + g_mapped = simpleio.map_range(green_pot.value, 0, 1023, 0, 255) + b_mapped = simpleio.map_range(blue_pot.value, 0, 1023, 0, 255) + + # converting neoslider data to integers + r_pot = int(r_mapped) + g_pot = int(g_mapped) + b_pot = int(b_mapped) + + # rotary encoder position check + if position != last_position: + # rotary encoder is ranged to 0-3 + if position > last_position: + x = (x + 1) % 4 + if position < last_position: + x = (x - 1) % 4 + # send rotary encoder value over socket + # identifying string is "enc" + c.send(str.encode(' '.join(["enc", str(x)]))) + # reset last_position + last_position = position + # sliders only update data for changes >15 to avoid flooding socket + # red neoslider position check + if abs(r_pot - last_r) > 15: + # send red neoslider data over socket + # identifying string is "red" + c.send(str.encode(' '.join(["red", str(r_pot)]))) + # reset last_r + last_r = r_pot + # green neoslider position check + if abs(g_pot - last_g) > 15: + # send green neoslider data over socket + # identifying string is "green" + c.send(str.encode(' '.join(["green", str(g_pot)]))) + # reset last_g + last_g = g_pot + # blue neoslider position check + if abs(b_pot - last_b) > 15: + # send blue neoslider data over socket + # identifying string is "blue" + c.send(str.encode(' '.join(["blue", str(b_pot)]))) + # reset last_b + last_b = b_pot + # VL53L4CD value check + if abs(flight - last_flight) > 2: + # setting max value of 45 + if flight > 45: + flight = 45 + # send VL53L4CD data over socket + # identifying string is "flight" + c.send(str.encode(' '.join(["flight", str(flight)]))) + # reset last_flight + last_flight = flight + # set neopixels on neosliders to match background color of Processing animations + r_pix.fill((r_pot, g_pot, b_pot)) + g_pix.fill((r_pot, g_pot, b_pot)) + b_pix.fill((r_pot, g_pot, b_pot)) + # reset the VL53L4CD + vl53.clear_interrupt() + \ No newline at end of file diff --git a/Raspberry_Pi_Video_Synth/ProcessingRaspberryPiVideoSynth.pde b/Raspberry_Pi_Video_Synth/ProcessingRaspberryPiVideoSynth.pde new file mode 100644 index 000000000..cadccae5e --- /dev/null +++ b/Raspberry_Pi_Video_Synth/ProcessingRaspberryPiVideoSynth.pde @@ -0,0 +1,261 @@ +// SPDX-FileCopyrightText: 2022 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Processing library for Networking +// make sure that you have the library installed! +import processing.net.*; + +// HTTP client +Client myClient; + +// variables for receiving data from Blinka socket +int index; +String inString; + +// holding the red, green, blue data +String[] r; +String[] g; +String[] b; +int red; +int green; +int blue; + +// holding the VL53L4CD data +String[] f; +int flight; + +// cat and pizza images +//emojis are from the OpenMoji emoji library (https://openmoji.org/) +PImage cat_img; +PImage pizza_img; + +// colors for Circles animation +color c_red = color(255, 0, 0); +color c_green = color(0, 255, 0); +color c_blue = color(0, 0, 255); +color c_yellow = color(255, 125, 0); +color c_aqua = color(0, 125, 255); +color c_purple = color(255, 0, 255); + +IntList colors; + +// float for Cube animation +float i = 0.0; + +// variables for Circles animation +int rad = 60; +float xpos, ypos; + +float xspeed = 2.8; +float yspeed = 10; + +int xdirection = 1; +int ydirection = 1; + +// variables for pizzaCat animation +float pizza_speed = 20; +float cat_speed = 30; + +float pizza_pos, cat_pos; + +int img_w = 10; + +int pizza_dir = 1; +int cat_dir = 1; +int num_cats; + +// variables for dancingTriangles animation +int x1; +int y1; +int x2; +int y2; +int x3; +int y3; + +void setup() +{ + // setting animations to run fullscreen with P3D + fullScreen(P3D); + // RGB color mode with value range of 0-255 + colorMode(RGB, 255); + ellipseMode(RADIUS); + // setting xpos and ypos in center + xpos = width/2; + ypos = height/2; + + // creating array of colors + // this is used for the Circles animation + colors = new IntList(); + colors.append(c_red); + colors.append(c_yellow); + colors.append(c_green); + colors.append(c_aqua); + colors.append(c_blue); + colors.append(c_purple); + + // loading the cat and pizza images + cat_img = loadImage("cat.png"); + pizza_img = loadImage("pizza.png"); + + // connecting to socket to communicate with Blinka script + myClient = new Client(this, "127.0.0.1", 12345); + +} + +// void draw() is the loop in Processing +void draw() +{ + //if data is coming in over the socket... + if (myClient.available() > 0) { + //string data is stored in inString + inString = myClient.readString(); + //if the string begins with 'enc' + //aka is a msg from the rotary encoder... + if (inString.startsWith("enc")) { + // the encoder pos is stored in index + String[] q = splitTokens(inString); + index = int(q[1]); + } + //if the string begins with 'red' + //aka is from the red neoslider + if (inString.startsWith("red")) { + //the red value is stored in red + String[] r = splitTokens(inString); + red = int(r[1]); + } + //if the string begins with 'green' + //aka is from the green neoslider + if (inString.startsWith("green")) { + // the green value is stored in green + String[] g = splitTokens(inString); + green = int(g[1]); + } + //if the string begins with 'blue' + //aka is from the blue neoslider + if (inString.startsWith("blue")) { + //the blue value is stored in blue + String[] b = splitTokens(inString); + blue = int(b[1]); + } + //if the string begins with flight + //aka is from the VL53L4CD + if (inString.startsWith("flight")) { + //the time of flight value is stored in flight + String[] f = splitTokens(inString); + flight = int(f[1]); + } + } + //the encoder's position corresponds with which animation plays + if (index == 0) { + circles(); + } + + if (index == 1) { + cube(); + } + if (index == 2) { + dancingTriangles(); + } + if (index == 3) { + pizzaCat(); + } + } + +//the Circles animation +//colorful circles randomly appear in the middle of the screen +//background color is affected by the sliders +//the circles' size is affected by the VL53L4CD +void circles() { + background(red, green, blue); + strokeWeight(1); + + ypos = ypos + ( yspeed * ydirection ); + + if (ypos > height-rad || ypos < rad) { + ydirection *= +1; + } + + int size = int(map(flight, 0, 45, 300, 25)); + + for (int i = 0; i < 10; i++) { + for (int z = 0; z < 6; z++) { + fill(colors.get(z)); + circle(width/2, random(ypos), random(size)); + } + } +} + +//the Cube animation +//a 3D cube spins in the center of the screen +//background color is affected by the sliders +//the speed of the spinning cube is affected by the VL53L4CD +void cube() { + strokeWeight(5); + + float speed = map(flight, 0, 45, 10, 0.1); + + background(red, green, blue); + translate(width/2, height/2, 0); + + i = i + speed; + if (i > 180) { + i = 0.0; + } + rotateY(radians(i)); + noFill(); + box(500); +} + +//the Pizza Cat animation +//pizza and cat face emojis go back and forth across the screen +//emojis are from the OpenMoji emoji library (https://openmoji.org/) +//the background color is affected by the sliders +//the speed of the cat emojis are affected by the V53L4CD +void pizzaCat() { + background(red, green, blue); + int num_cats = int(map(flight, 0, 45, 65, 15)); + + pizza_pos = pizza_pos + ( pizza_speed * pizza_dir ); + cat_pos = cat_pos + ( num_cats * cat_dir ); + + if (pizza_pos + img_w > width || pizza_pos < img_w) { + pizza_dir *= -1; + } + if (cat_pos + img_w > height || cat_pos < img_w) { + cat_dir *= -1; + } + + for (int p = 0; p < 25; p++) { + image(cat_img, pizza_pos-10, cat_pos*p); + image(pizza_img, pizza_pos*p, cat_pos+10); + } +} + +// the dancingTriangles animation +// triangles are randomly generated in the center of the screen +//the background is affected by the sliders +// the speed of new triangles being added are affected by the V53L4CD +void dancingTriangles() { + int speed = int(map(flight, 0, 45, 25, 100)); + + background(red, green, blue); + strokeWeight(30); + + for (int w = 800; w < 1000; w ++) { + for (int h = 1100; h < 1500; h++) { + + x1 = int(random(h)); + y1 = int(random(w)); + + x2 = int(random(h)); + y2 = int(random(w)); + + x3 = int(random(h)); + y3 = int(random(w)); + } + } + noFill(); + triangle(x1, y1, x2, y2, x3, y3); + delay(speed); +} diff --git a/Raspberry_Pi_Video_Synth/cat.png b/Raspberry_Pi_Video_Synth/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..47119979e606d4e3f4e2f576c61b66e16f869e5e GIT binary patch literal 18296 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 a_uZU>{#{_?ALGat0FZhnx-~iuk$(aHn>lg- literal 0 HcmV?d00001 diff --git a/Raspberry_Pi_Video_Synth/pizza.png b/Raspberry_Pi_Video_Synth/pizza.png new file mode 100644 index 0000000000000000000000000000000000000000..508c40792ad16a679e8b4603463bd946b55501cf GIT binary patch literal 10590 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