Exercise 1.
p5 code:
let position; let mass = 50; let potValue = 0; function setup() { createCanvas(640, 360); noFill(); // Initialize position of the ellipse position = createVector(width / 2, height / 2); } function draw() { background(255); // Map potentiometer value to horizontal position position.x = map(potValue, 0, 1023, 0, width); // Keep the ellipse in the middle ellipse(position.x, height / 2, mass, mass); } function keyPressed(){ if (key == " ") { //set up serial setUpSerial(); } } function readSerial(value) { potValue = int(value); // Parse the potentiometer value }
Arduino Code:
void setup() { Serial.begin(9600); // Start serial communication } void loop() { int potValue = analogRead(A0); // Read the potentiometer value Serial.println(potValue); // Send the value to p5.js delay(10); }
Exercise 2.
p5 code:
function setup() { createCanvas(400, 400); } function draw() { background(225); // brightness based on cursor's x position let brightness = map(mouseX, 0, width, 0, 255); brightness = constrain(brightness, 0, 255); // Ensure brightness stays within range // Send brightness value to Arduino if serial is active if (serialActive) { writeSerial(`${brightness}\n`); } } function keyPressed(){ if (key == " ") { //set up serial setUpSerial(); } } function readSerial(value) { potValue = int(value); // Parse the potentiometer value }
Arduino Code:
int ledPin = 9; int brightness = 0; void setup() { Serial.begin(9600); // Start serial communication pinMode(ledPin, OUTPUT); //LED pin as output } void loop() { if (Serial.available() > 0) { // Read the incoming brightness value brightness = Serial.parseInt(); brightness = constrain(brightness, 0, 255); // Set the LED brightness analogWrite(ledPin, brightness); } }
Exercise 3.
p5 code:
let velocity; let gravity; let position; let acceleration; let wind; let drag = 0.99; let mass = 50; let potValue = 0; // potentiometer value let serialConnected = false; let onGround = false; // whether ball is on the ground 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); } function draw() { background(255); if (!serialConnected) { textAlign(CENTER, CENTER); fill(0); text("Press 'Space' key on the keyboard", width / 2, height / 2); return; } applyForce(wind); applyForce(gravity); velocity.add(acceleration); velocity.mult(drag); position.add(velocity); acceleration.mult(0); // check for bounce on the x axis if (position.x > width - mass / 2) { if(!onGround){ position.x = width - mass / 2; velocity.x *= -0.9; } } else if (position.x < mass / 2) { position.x = mass / 2; velocity.x *= -0.9; } // check for bounce on the y axis if (position.y > height - mass / 2) { velocity.y *= -0.9; position.y = height - mass / 2; if (!onGround) { sendBounceSignal(); onGround = true; } } else { onGround = false; } wind.x = map(potValue, 0, 1023, -1, 1); ellipse(position.x, position.y, mass, mass); // boundaries on x axis if (position.x > width - mass / 2 || position.x < mass / 2) { velocity.x *= -0.9; } } function applyForce(force) { let f = p5.Vector.div(force, mass); acceleration.add(f); } // bouncing signal to Arduino function sendBounceSignal() { if (serialActive) { let sendToArduino = "1\n"; writeSerial(sendToArduino); } } // receive data from Arduino function readSerial(data) { potValue = int(trim(data)); } // initialize serial connection function keyPressed() { if (key == ' ') { mass = random(10,100); setUpSerial(); serialConnected = true; } } function serialOpened() { serialActive = true; }
Arduino code:
const int potPin = A0; const int ledPin = 13; int potValue = 0; bool ledState; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { // read the potentiometer value potValue = analogRead(potPin); // send potentiometer value to p5 Serial.println(potValue); // check for data from p5 if (Serial.available() > 0) { char received = Serial.read(); if (received == '1' && !ledState) { // turn on the LED digitalWrite(ledPin, HIGH); ledState = true; delay(100); // turn off the LED digitalWrite(ledPin, LOW); } else if (received != '1'){ ledState = false; } } delay(50); }
Video demonstration: