Pelota interactiva con Arduino + Processing

Con este proyecto comunicamos Arduino con Processing y usamos dinámicas básicas como la caída y rebote de una bola en Processing en función de un piezoeléctrico (sensor de vibración) conectado a Arduino.

Para este proyecto hemos utilizado:
Hardware:

  • Arduino(en nuestro caso Arduino UNO)
  • Protoboard
  • Piezoeléctrico
  • Resistencia 1M ohm

Software:

  • Programa Arduino: Lo hemos desarrollado nosotros
  • Programa de Processing: Simplemente hemos buscado alguna dinámica que nos interesase y lo hemos adecuado a nuestras necesidades. Puedes verlo aquí.­ También puedes usar el nuestro, ver código más abajo.

-Conexión Piezo-Arduino:
knock_bb

– Código Arduino:
Primero debemos ajustar el código de Processing en función del puerto de Arduino. Puedes ver cómo hacerlo aquí. Después solo debemos cargar el código a Arduino e iniciar Processing.

// En este programa se capta el valor de un sensor analogico y lo envia por el puerto serie para que processing lo reciba.


//Aqui declaramos la variables que necesitaremos para leer los datos del sensor.
int piezoPin=A1;
int piezoVal=0;
//Estas variables nos serviran para sacar solo el valor mayor de estas (ya que tiene rebote).
int x=0;
int i=0;
int z=0;

void setup(){
  Serial.begin(9600);//Inicializamos el puerto serial para enviar datos a processing.
}

void loop(){
  //En este bloque leemos el sensor y sacamos solo el mayor de sus valores
  piezoVal=analogRead(piezoPin);
  while(piezoVal!=0){
    piezoVal=analogRead(piezoPin);
    if(piezoVal>x){
      x=piezoVal;
    }
  }
  //Despues simplemente enviamos el valor por el Serial.
  if(x>10){
    Serial.write(x);
  }
  delay(130);
  x=0;
}

– Código Processing:

 

/* 
Dinamica bola
Codigo modificado de https://ddpde.wordpress.com/
Por Gabriel Koh y Miguel Granero */

import processing.serial.*; //Importamos la librería Serial

float x=0;
int able=1;
int diam = 30;          //diametro de la bola
float diamS = 0;
int beat = 0;
float posX = 40;
float posY = 480;
float velX = 3;
float velY = 0;
int voltea = -1;
//el tope de la ventana
int tope = 0;//variables de la física de nuestro mundillo
float friccion = 0.9;  // modificando este parametro la bola se para antes
// estaba en 0.95 y botaba mas
float gravedad = 1;

Serial port; //Nombre del puerto serie
int valor=0;//Valor de la temperatura

void setup() {
  // Introducir aqui el numero de puerto al que se conecte Arduino
  port = new Serial(this, Serial.list()[0], 9600);
  size(80, 500);
  frameRate(60);
  smooth();
  ellipseMode(CENTER);
  background(50);
  println(Serial.list());
  port.clear();
}
void draw() {
  if (able==1) {
    if (port.available() > 0) // si hay algún dato disponible en el puerto
    {
      valor=port.read();//Lee el dato y lo almacena en la variable "valor"
      println(valor);
    }
  if (valor!=0 && velY<=0) {
    velY = map(valor, 400, 0, -50, 0);
    valor=0;
  }
    posX = constrain(posX, diam/2, width-diam/2);
    posY = constrain(posY, -500, height-diam/2);
    //refresca el fondo
    background(50);
    stroke(255);
    fill(120, posX/2, posY);
    ellipse(posX, posY, diam, diam);
    //aumenta la velocidad vertical en cada ciclo de draw
    velY = velY + gravedad;
    posY = posY + velY;//Condicional:
    //si la bolita toca cualquiera de los bordes de la ventana
    //invertir la velocidad para que se mueva en sentido contrario
    if(posY<0){
    posY=0;
    }
    if (posX > width-diam/2 || posX < diam/2) {
      velX = velX * -friccion;
    }
    //además, si la bola toca el fondo de la ventana
    //invertir el valor de la velocidad
    else if (posY > height-diam/2 || posY < tope+diam/2) {
      velY = velY * -friccion;
      velX = velX * friccion;
    }
    if (posY > height-diam/2 && velY<-5) {
      x=map(velY, 0, 500, 10, 0);
      clear();
      background(50);
      ellipse(posX, posY, diam+x, diam-x);
    }
  }
}

Realizado por Miguel Granero y Gabriel Koh

 

Deja un comentario