Piet Mondrian and Rubber Duck

Description

I created an interactive Piet Mondrian painting using Processing, Arduino, a LED and a rubber duck.

First, when I run Processing and click on the artboard, a piece of music will be played, and the color blocks of the Piet Mondrian will appear and start dancing.

Secondly, when I squeeze the rubber duck, a duck image will appear on my Processing artboard and move up and down based on the level of pressure I put on the actual rubber duck. The LED light inside the duck will also increase based on the level of pressure. The FSR inside the rubber duck transfers the pressure into Arduio, from Arduio to the port, from the port to the Processing. In Processing, the level of pressure converts into the position of a duck image.

Components

  • 1 Arduino
  • 1 LEDs
  • 4 Resistors
  • 1 FSR
  • 1 Breadboard
  • 1 Rubber Duck
  • 1 Processing

Code

Arduino

int fsrAnalogPin = A0;
int LEDpin = 11;     
int fsrReading;      
int LEDbrightness;

void setup(void) {
  Serial.begin(9600);   
  pinMode(LEDpin, OUTPUT);
}
 
void loop(void) {
  fsrReading = analogRead(fsrAnalogPin);
  Serial.println(fsrReading);
  LEDbrightness = map(fsrReading, 0, 1023, 0, 255);
  analogWrite(LEDpin, LEDbrightness);
  delay(100);
}

Processing

PImage img; // Declare variable 'img' of type PImage

import processing.serial.*;
// Change this to the portname your Arduino board
String portname = "/dev/cu.usbmodem1411"; // or "COM5"
Serial port;
String buf="";
int cr = 13; // ASCII return == 13
int lf = 10; // ASCII linefeed == 10
int serialVal = 0;

Maxim maxim;
AudioPlayer player;
float power=0;
//float threshold = 0.35;// vary this until the square appears on the beats
float threshold = 0.35;// vary this until the square appears on the beats
int wait = 0;
boolean playit = false;

float x = 0;
float y = 0;


void setup() {
  size(800,450);
  frameRate(20); // this is the framerate. Tweak for performance.
  maxim = new Maxim(this);
  player = maxim.loadFile("beat1.wav");
  player.setLooping(true);
  player.setAnalysing(true);
  smooth();
  noStroke();
  port = new Serial(this, portname, 9600);

  img = loadImage("duck.png");
  
  
}

void draw() {
  background(255);
  println(wait);
  stroke(0);
  strokeWeight(6);
  line(90,0,90,500); //first line left
  line(150,0,150,500); // second line left
  line(200,0,200,80); // third line left
  line(400,300,400,380); // fourth line left
  line(460,0,460,500); // middle line
  line(520,80,520,500); // fourth line right
  line(700,380,700,500); // third line right
  line(720,0,720,80); // second line right
  line(750,0,750,380); // first line right
  
  line(0,40,150,40);//first line top
  line(460,40,750,40); // first line top, middle
  line(150,80,800,80); //second line top
  line(460,150,800,150); //third line top
  line(0,300,460,300); //left, second line bottom
  line(0,380,800,380); //left, first line bottom
  line(150,420,700,420); //middle, first line bottom

if (playit) {
    //fill(0);
  player.play(); 
  power = player.getAveragePower(); 
  rectMode(CENTER);
  noStroke();
  fill(235,215,0);
    //ellipse(mouseX,mouseY,power*500,power*500);
  rect(x+120,y+18,32+(power*70),14+(power*70)); //second yellow rect left
  rect(x+635,y+265,200+(power*70),200+(power*70));//big yellow rect
  rect(x+776,y+115,25+(power*70),40+(power*70));//first yellow rect right
  fill(185,0,0);
  rect(x+305,y+190,250+(power*180),160+(power*180)); //big red rect
  rect(x+490,y+400,30+(power*70),11+(power*70)); //small red rect, bottom
 
  fill(0,40,105);
  rect(x+43,y+417,77+(power*20),57+(power*20));//left bottom blue rect 
  rect(x+610,y+437,165+(power*20),20+(power*20));//middle bottom blue rect
  rect(x+590,y+60,242+(power*20),24+(power*20));//top  blue rect
    if (power>threshold && wait < 0) {
    noStroke();
    fill(235,215,0);
    rect(x+43,y+19,87,37);//first yellow rect left
    fill(185,0,0);
    rect(x+153+152,y+383+18,305,36); //long red rect 
    rect(x+735,y+19,25,38); //small red rect, top
    fill(0,40,105);
    rect(x+44,y+341,88,75);//left, second bottom blue rect
    wait=4;
  }
  wait--;
 
}

  int xDuck = int(random(800));
  int yDuck = int(random(450));
  image(img, (1600-serialVal)/2, (900-serialVal)/2);
  
}

// called whenever serial data arrives
void serialEvent(Serial p) {
 int c = port.read();
 if (c != lf && c != cr) {
 buf += char(c);
 }
 if (c == lf) {
 serialVal = int(buf);
 println("val="+serialVal); 
 buf = ""; 
 }
}

void mousePressed() {
    playit = !playit;
    if (playit) {

         player.play();  
    } else {   
     player.stop();    
    }
  
}

Leave a Reply