These are IM Week 12 Assignments by Pi and Darko
Production 1
Make something that uses only one sensor on Arduino and makes the ellipse in p5 move on the horizontal axis, in the middle of the screen, and nothing on arduino is controlled by p5
let rVal = 0; let alpha = 255; let left = 0; // True (1) if mouse is being clicked on left side of screen let right = 0; // True (1) if mouse is being clicked on right side of screen let xPos = 0; // Position of the ellipse function setup() { createCanvas(640, 480); textSize(18); noStroke(); } function draw() { // one value from Arduino controls the background's red color background(255, 255, 255); // Update the position of the ellipse based on the alpha value // Mapping alpha to the width of the canvas xPos = map(alpha, 0, 1023, 0, width); // Draw an ellipse that moves horizontally across the canvas fill(255, 0, 255, 255); // Same mapping as the text transparency ellipse(xPos, height / 2, 50, 50); // Position ellipse at center height with a diameter of 50 if (!serialActive) { text("Press Space Bar to select Serial Port", 20, 30); } else { text("Connected", 20, 30); // Print the current values text('rVal = ' + str(rVal), 20, 50); text('alpha = ' + str(alpha), 20, 70); } } function keyPressed() { if (key == " ") { // important to have in order to start the serial connection!! setUpSerial(); } } function readSerial(data) { if (data != null) { let fromArduino = split(trim(data), ","); if (fromArduino.length == 2) { rVal = int(fromArduino[0]); alpha = int(fromArduino[1]); } let sendToArduino = left + "," + right + "\n"; writeSerial(sendToArduino); } }
Production 2
Make something that controls the LED brightness from p5
let rVal = 0; let alpha = 255; let left = 0; // True (1) if mouse is being clicked on left side of screen let right = 0; // True (1) if mouse is being clicked on right side of screen let xPos = 0; // Position of the ellipse let ledState = false; // To toggle LEDs function setup() { createCanvas(640, 480); textSize(18); noStroke(); } function draw() { // one value from Arduino controls the background's red color background(255, 255, 255); // Update the position of the ellipse based on the alpha value // Mapping alpha to the width of the canvas xPos = map(alpha, 0, 1023, 0, width); if (!serialActive) { text("Press Space Bar to select Serial Port", 20, 30); } else { text("Connected", 20, 30); // Print the current values text('rVal = ' + str(rVal), 20, 50); text('alpha = ' + str(alpha), 20, 70); } text("Then, press A to flash the police lights.",20, 100) //Edit the code below // Toggle LED state every frame if space is held down if (keyIsDown(65)) { // 32 is the ASCII code for space ledState = !ledState; if (ledState) { left = 1; right = 0; } else { left = 0; right = 1; } } // Edit the code above } function keyPressed() { if (key == " ") { // important to have in order to start the serial connection!! setUpSerial(); } } function keyReleased(){ if (key == "a") { left = 0; right = 0; } } function readSerial(data) { if (data != null) { let fromArduino = split(trim(data), ","); if (fromArduino.length == 2) { rVal = int(fromArduino[0]); alpha = int(fromArduino[1]); } let sendToArduino = left + "," + right + "\n"; writeSerial(sendToArduino); } }
Gravity Wind
Take the gravity wind example (https://editor.p5js.org/aaronsherwood/sketches/I7iQrNCul) and make it so every time the ball bounces one led lights up and then turns off, and you can control the wind from one analog sensor
let velocity; let gravity; let position; let acceleration; let wind; let drag = 0.99; let mass = 50; let rVal = 0; let alpha = 255; let left = 0; // True (1) if mouse is being clicked on left side of screen let right = 0; // True (1) if mouse is being clicked on right side of screen let serialSetup = false; // Declare a variable to store the time at which to trigger the action let triggerTime = 0; function setup() { createCanvas(640, 360); noFill(); position = createVector(width / 2, 0); velocity = createVector(0, 0); acceleration = createVector(0, 0); gravity = createVector(0, 0.5 * mass); wind = createVector(0, 0); // Set the trigger time to be 5 seconds after setup runs triggerTime = millis() + 5000; textSize(20); } function draw() { // Check if the current time has passed the trigger time if (millis() >= triggerTime && !serialSetup) { serialSetup = true; } push(); fill(0); if (!serialSetup) { text("Simulation starts in 5 seconds. Press a to set up serial.", 20, 50); } pop(); if (serialSetup) { background(255); let windtext = ""; if (alpha < 300) { wind.x = -1; windtext = "Wind : Right"; } else if (alpha > 800) { wind.x = 1; windtext = "Wind : Left"; } else { wind.x = 0; windtext = "No wind."; } push(); fill(0); text(windtext, 20, 50); pop(); applyForce(wind); applyForce(gravity); velocity.add(acceleration); velocity.mult(drag); position.add(velocity); acceleration.mult(0); ellipse(position.x, position.y, mass, mass); if (position.y > height - mass / 2) { velocity.y *= -0.9; // A little dampening when hitting the bottom position.y = height - mass / 2; console.log( "Bounce! Position Y: " + position.y + ", Velocity Y: " + velocity.y ); left = 1; } else { left = 0; } } } function applyForce(force) { // Newton's 2nd law: F = M * A // or A = F / M let f = p5.Vector.div(force, mass); acceleration.add(f); } function keyPressed() { if (keyCode == LEFT_ARROW) { wind.x = -1; } if (keyCode == RIGHT_ARROW) { wind.x = 1; } if (key == " ") { mass = random(15, 80); position.y = -mass; velocity.mult(0); } if (key == "a") { // important to have in order to start the serial connection!! setUpSerial(); } } // This function will be called by the web-serial library // with each new *line* of data. The serial library reads // the data until the newline and then gives it to us through // this callback function function readSerial(data) { //////////////////////////////////// //READ FROM ARDUINO HERE //////////////////////////////////// if (data != null) { // make sure there is actually a message // split the message let fromArduino = split(trim(data), ","); // if the right length, then proceed if (fromArduino.length == 2) { // only store values here // do everything with those values in the main draw loop // We take the string we get from Arduino and explicitly // convert it to a number by using int() // e.g. "103" becomes 103 rVal = int(fromArduino[0]); alpha = int(fromArduino[1]); } ////////////////////////////////// //SEND TO ARDUINO HERE (handshake) ////////////////////////////////// let sendToArduino = left + "," + right + "\n"; writeSerial(sendToArduino); } }