xxxxxxxxxx
217
let velocity;
let gravity;
let position_;
let acceleration;
let wind;
let drag = 0.99;
let mass = 30;
let new_wind;
const serial = new p5.WebSerial();
let portButton;
let inData; // incoming serial data
let led = 0; // led
function setup() {
createCanvas(400, 400);
noFill();
position_ = createVector(width/2, 0);
velocity = createVector(0,0);
acceleration = createVector(0,0);
gravity = createVector(0, 0.5*mass);
wind = createVector(0,0);
// check to see if serial is available:
if (!navigator.serial)
{
alert("WebSerial is not supported in this browser. Try Chrome or MS Edge.");
}
// if serial is available, add connect/disconnect listeners:
navigator.serial.addEventListener("connect", portConnect);
navigator.serial.addEventListener("disconnect", portDisconnect);
// check for any ports that are available:
serial.getPorts();
// if there's no port chosen, choose one:
serial.on("noport", makePortButton);
// open whatever port is available:
serial.on("portavailable", openPort);
// handle serial errors:
serial.on("requesterror", portError);
// handle any incoming serial data:
serial.on("data", serialEvent);
serial.on("close", makePortButton);
}
function draw() {
background(255);
applyForce(wind);
applyForce(gravity);
velocity.add(acceleration);
velocity.mult(drag);
position_.add(velocity);
acceleration.mult(0);
fill(255);
ellipse(position_.x,position_.y,mass,mass);
// bouncing and losing velocity
if (position_.y > height - mass/2) {
velocity.y *= -1;
position_.y = height - mass/2;
}
// dont let the ball go outside canvas
if ((position_.x - mass/2) < 2.5) {
position_.x = mass/2 + 5;
}
if (position_.x >= (400 - mass/2) - 2.5) {
position_.x = 400 - mass/2 - 5;
}
// turn on led when ball bounces
if (position_.y > height - mass/2 - mass) {
if (velocity.y > 1) {
serial.write(255);
}
}
// change wind direction
wind_strength = 5;
new_wind = map(inData, 0, 255, -wind_strength, wind_strength);
print("this is indata", inData);
wind.x = new_wind;
// wind.y = new_wind;
}
// Replicates the ball's movement
function applyForce(force)
{
// Newton's 2nd law: F = M * A
// or A = F / M
let f = p5.Vector.div(force, mass);
acceleration.add(f);
}
// Keyboard Control
function keyPressed()
{
if (keyCode==LEFT_ARROW){
wind.x=-3;
}
if (keyCode==RIGHT_ARROW){
wind.x=3;
}
if (key==' '){
position_.y=mass;
velocity.mult(0);
}
}
// read any incoming data as a string
// (assumes a newline at the end of it):
function serialEvent()
{
inData = Number(serial.read());
// console.log(inData);
serial.write(led);
}
/* %%%%%%%%%%%%%%%%%% ARDUINO CODE %%%%%%%%%%%%%%%%%%
int ledPin = 5;
int poten = A0;
int serialRead = 0;
void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop()
{
while (Serial.available() > 0)
{
serialRead = Serial.read();
analogWrite(ledPin, serialRead);
}
int mappedPot = map(analogRead(poten), 0, 1023, 0, 255);
Serial.write(mappedPot);
delay(100);
}
*/
// %%%%%%%%%%%%%%%%%% PORT STUFF %%%%%%%%%%%%%%%%%%
function makePortButton()
{
// create and position_ a port chooser button:
portButton = createButton("choose port");
portButton.position(10, 10);
// give the port button a mousepressed handler:
portButton.mousePressed(choosePort);
}
// make the port selector window appear:
function choosePort()
{
if (portButton) portButton.show();
serial.requestPort();
}
// open the selected port, and make the port
// button invisible:
function openPort() {
// wait for the serial.open promise to return,
// then call the initiateSerial function
serial.open().then(initiateSerial);
// once the port opens, let the user know:
function initiateSerial() {
console.log("port open");
}
// hide the port button once a port is chosen:
if (portButton) portButton.hide();
}
// pop up an alert if there's a port error:
function portError(err)
{
alert("Serial port error: " + err);
}
// try to connect if a new serial port
// gets added (i.e. plugged in via USB):
function portConnect()
{
console.log("port connected");
serial.getPorts();
}
// if a port is disconnected:
function portDisconnect()
{
serial.close();
console.log("port disconnected");
}
function closePort()
{
serial.close();
}