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.
– 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