Example 1 – Arduino to p5 communication
The potentiometer was used to control the horizontal axis of the ellipse.
Setup
Schematic
P5 code
let X = 0; // ellipse x position function setup() { createCanvas(400, 400); } function draw() { background(240); fill('rgb(134,126,126)'); ellipse(X, height/2, 80); } function keyPressed() { if (key === " ") { setUpSerial(); // Start the serial connection on space bar press } } // Processes incoming data from Arduino function readSerial(data) { if (data != null) { let fromArduino = split(trim(data), ","); // Split incoming data by commas if (fromArduino.length >= 1) { // Process the first value for X position let potValue = int(fromArduino[0]); // Convert string to integer X = map(potValue, 0, 1023, 50, width - 50); // Map potentiometer value to X position Y = height / 2; // Keep Y position constant } } }
Arduino code
Video
Example 2 – P5 to Arduino Communication
The horizontal position of the mouse detects the brightness of the LED.
Setup
Schematic
P5 code
let brightness = 0; // Brightness value to send to Arduino function setup() { createCanvas(640, 480); textSize(18); } function draw() { background(255); if (!serialActive) { // If serial is not active display instruction text("Press Space Bar to select Serial Port", 20, 30); } else { // If serial is active, display connection status and brightness value text("Connected", 20, 30); text('Brightness = ' + str(brightness), 20, 50); } // Map the mouseX position (0 to width) to brightness (0 to 255) brightness = map(mouseX, 0, width, 0, 255); brightness = constrain(brightness, 0, 255); // Ensures brightness is within the range 0-255 // Sends brightness value to Arduino sendToArduino(brightness); } function keyPressed() { if (key == " ") { // Start serial connection when the space bar is pressed setUpSerial(); } } function readSerial(data) { if (data != null) { } } // We dont need this part of the code because we are not getting any value from the Arduino // Send brightness value to Arduino function sendToArduino(value) { if (serialActive) { let sendToArduino = int(value) + "\n"; // Convert brightness to an integer, add newline writeSerial(sendToArduino); // Send the value using the serial library } }
Arduino Code
Video
Example 3 – Bi-Directional Communication
Every time the ball bounces and LED blinks, and the wind is controlled by the light sensor
Setup
Schematic
P5 Code
let velocity; let gravity; let position; let acceleration; let wind; let drag = 0.99; let mass = 50; let windValue = 0; // Wind value from Arduino (light sensor) let serialConnected = false; // Tracks if the serial port is selected function setup() { createCanvas(640, 360); textSize(18); 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) { // Show instructions to connect serial port textAlign(CENTER, CENTER); fill(0); // Black text text("Press Space Bar to select Serial Port", width / 2, height / 2); return; // Stop loop until the serial port is selected } else if (!serialActive) { // Show connection status while waiting for serial to activate textAlign(CENTER, CENTER); fill(0); text("Connecting to Serial Port...", width / 2, height / 2); return; // Stop until the serial connection is active } else { // display wind value and start the simulation if connected textAlign(LEFT, TOP); fill(0); text("Connected", 20, 30); text('Wind Value: ' + windValue, 20, 50); } // Apply forces to the ball applyForce(wind); applyForce(gravity); // Update motion velocity.add(acceleration); velocity.mult(drag); position.add(velocity); acceleration.mult(0); // Draw the ball ellipse(position.x, position.y, mass, mass); // Check for bounce if (position.y > height - mass / 2) { velocity.y *= -0.9; position.y = height - mass / 2; // Keep the ball on top of the floor // Sends signal to Arduino about the bounce sendBounceSignal(); } // Update wind force based on Arduino input wind.x = map(windValue, 0, 1023, -1, 1); // Map sensor value to wind range } function applyForce(force) { let f = p5.Vector.div(force, mass);// Force divided by mass gives acceleration acceleration.add(f); } // Send a bounce signal to Arduino function sendBounceSignal() { if (serialActive) { let sendToArduino = "1\n"; // Signal Arduino with "1" for a bounce writeSerial(sendToArduino); } } // incoming serial data from Arduino function readSerial(data) { if (data != null) { windValue = int(trim(data)); // store the wind value } } // Press space bar to initialize serial connection function keyPressed() { if (key == " ") { setUpSerial(); // Initialize the serial connection serialConnected = true; // Mark the serial port as selected } } // Callback when serial port is successfully opened function serialOpened() { serialActive = true; // Mark the connection as active }
Arduino Code
Video