Serial Communication Exercises Assignment:
Exercise (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
ellipse(map(alpha, 0, 1023, 0, 640), 80, 80, 80);
Video Demonstration IMG_5539 2
Exercise (2) make something that controls the LED brightness from p5
function keyPressed() { // set up connection with p5: if (key == " ") { setUpSerial(); } if (key == "1"){ left = 10; } if (key == "2"){ left = 100; } if(key == "3"){ left = 255; } }
Exercise (3) take the gravity wind example 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
P5 CODE let velocity; let gravity; let position; let acceleration; let wind; let drag = 0.99; let mass = 50; let isBouncing = 0; function setup() { createCanvas(640, 480); textSize(18); 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 (!serialActive) { text("Press Space Bar to select Serial Port", 20, 30); } else { 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; isBouncing = 1; } else { isBouncing = 0; } } } function keyPressed() { if (key == " ") { // important to have in order to start the serial connection!! setUpSerial(); } else if (key == "ENTER") { mass = random(15, 80); position.y = -mass; velocity.mult(0); } } function readSerial(data) { 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 == 1) { // only store values here // do everything with those values in the main draw loop let potValue = int(fromArduino[0]); wind.x = map(potValue, 0, 1023, -1, 1); } ////////////////////////////////// //SEND TO ARDUINO HERE (handshake) ////////////////////////////////// let sendToArduino = isBouncing + "\n"; writeSerial(sendToArduino); } } function applyForce(force) { // Newton's 2nd law: F = M * A // or A = F / M let f = p5.Vector.div(force, mass); acceleration.add(f); } ARDUINO CODE int ledPin = 5; const int potPin = A1; void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); pinMode(ledPin, OUTPUT); pinMode(potPin, INPUT); // start the handshake while (Serial.available() <= 0) { digitalWrite(LED_BUILTIN, HIGH); // on/blink while waiting for serial data Serial.println("0,0"); // send a starting message delay(300); // wait 1/3 second digitalWrite(LED_BUILTIN, LOW); delay(50); } } void loop() { // wait for data from p5 before doing something while (Serial.available()) { digitalWrite(LED_BUILTIN, HIGH); // led on while receiving data digitalWrite(ledPin, LOW); int isBouncing = Serial.parseInt(); if (Serial.read() == '\n') { int potValue = analogRead(potPin); delay(5); Serial.println(potValue); } // Set LED brightness based on whether bouncing. if (isBouncing == 1) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } digitalWrite(LED_BUILTIN, LOW); }