Categories
creative coding lab reading responses

conditional design

  • What do we learn about the process of the designers and the artist discussed in the text? What is the role of “process” in their overall activity?

Process is seen not only as an integral part of the final product, but rather as a product itself. It is argued that every good work has to portray a seamless transition from the process to the final form. Process is what is important as it is the goal of Conditional Drawings, the activity of creation becomes the goal.

  • Describe how their approach differs from designs or drawings you have created in the past and what the impact on the resulting work is. 

For most of my Visual Arts practice, the goal of my creative endeavor was the final product: the painting, the drawing, the prints, the sculpture, etc. I believe this approach is quite static and thrives on the idea of uniqueness of the “artist’s hand”, which, of course, is not bad, however it usually does not provoke a question “How is it done?”. 

  • The text introduces the concept of the conditional drawing, where the artwork is the result of a series of instructions (rules) being performed. Can you imagine a (short) set of rules that, when followed on a sheet of paper, might produce an interesting, or unexpected, result?

1

Maybe something like: start with a triangle (2cm sides)  in the center and then increase the amount of angles in each following shape. (rectangle next, then pentagon, etc.). each next figure should share a side with already existing shape. 

2

Or maybe: start with a diagonal line (3 cm long at one of the angles of the paper sheet and then each next line should be perpendicular to the previous line (but the same length (or increasing by 0.5cm??))

  • Describe your thought process when devising your rules. Can you imagine the resulting image in your head, or are you tempted to act out your own rules on a sheet of paper – just to get an idea of what the result might look like? (If the latter, try to identify what part of your rules made you do so.)

When thinking about the rules, I was trying to imagine how the product would slowly unravel (so I have identified the starting points and the sizes). However, I am tempted to try out the rules on the paper because it seems quite unpredictable. I believe it would be even more unpredictable with several people (and their interpretation of rules).

Categories
prototyping documentation rapid prototyping

revolutionary travel dental device – final week

this week i have been focusing on composing a great presentation that would allow me to tell a story of my project.

by Wednesday, i was able to show a partially-complete presentation will callouts of the main features of my product that were accompanied by short bits of text and corresponding renders. Given that i have not yet finished creating slides dedicated to my project-story, i received some suggestions from professor regarding this + needed to add some renders that would show off the opening procedure more explicitly.

so, thats what i did:

significant slide 1: the story. here, i implemented pictures that show common problems that my device can solve.

significant slide 2&3: the main objectives of the device and the early development stages pictures.

significant slides 4&5: fusion 360 work…. to reflect, i could have added a little bit more on that, but i believe due to my process’ manner it still worked as it was so i am satisfied. 

significant slide6:  i am moderately proud of the work ive done here: even though the device does not look super-realistic with the environment, however i did try my best and took advantage of a lot of tools in Figma, including some plugins. this was also the first slide i have created and so the calm green color + grey + white looked quite complementary to my product, so i decided to follow through with it later as well.

significant slides 7,8,9: call outs on threads (that i have been struggling with for a million years) and showcasing the spaciousness of the device (showing the water in the bottom part and the fact that both toothbrush and toothpaste fit in it + the size)

also i am quite proud of how the green shapes align visually throughout the slides.

significant slides 10,11: callouts on the geko-tape and an environment render to showcase this feature (looking back, i could’ve placed the second part in the environment as well, but it is not a big deal in my opinion)

some key words to further showcase the coolness of the device.

significant slides 12: callout on the self-drainage feature + corresponding render. very proud of that one.

overall reflection:

they say there is no limit to greatness, and i agree. of course, there are a lot of things that could be further improved and changed, however i am quite satisfied with what my product and presentation turned out to be. 

i really enjoyed the process of working on this course’s assignment throughout this semester and i believe i acquired some invaluable experiences that will benefit me in future (prototyping process, fusion 360 skills, etc.)

Categories
prototyping documentation rapid prototyping

travel dental device: development – weeks 12&13

Throughout weeks 12 and 13 i have been working on finishing some details:

  • creating a thread that would allow the device to close and open without any issues

I wouldn’t say it wasn’t easy, but i really noticed how I have been understanding what to do myself (I didn’t even have to rewatch any of the lectures at that point!) That was very cool to notice how I suddenly got much more familiar with Fusion!

  • continue working on renders: as shown in the previous blogpost, renders in 3D environments i have found look rather awful, so i decided to go with another way of creating renders using 2D picture and then just “photoshopping” the device’s render with a transparent background onto the picture. 

Here are some photographs that I have chosen as potential environments (for some:

  • starting to work on my presentation

these weeks i was mostly working on finishing the model and working on my first renders, so i did not have much time left on actually implementing the transparent-background renders yet.

but here are some of the transparent-background renders i created:

as it can be seen, i have been experimenting with shades, exposure and light at that point, trying to find the perfect balance between all of them.

Categories
final project interaction lab

make, present & report

as i mentioned before, i was trying to create a space for people to create their own artwork depending on how loud they scream + the frequency. however, i quickly learned that if i want to something inside the space, it shouldn’t be a computer. hence, i started working on the “box” that would have restart/start button and three colors with which you can control what is displayed.

i started with the processing part and had an idea that processing would send the corresponding values regarding color to the Arduino. which vertical stripe was active right now, was dependent on the time. however, that didn’t work really well as then the color choice was awkward + the communication between two was too slow.

however, still, i had some “Arduino-independent” processing code:

import processing.sound.*;
import processing.serial.*;
import osteele.processing.SerialRecord.*;

Serial serialPort;
SerialRecord sender;
SerialRecord receiver;

int rows = 7;
int columns = 8;
int sizeOfPixel = 80;


int startT = 0;
boolean timeRecorded = false;

int [][] arrayOfColors = new int[columns][rows];

AudioIn mic;
Amplitude loudness;
float t = 0;
float currentPosition = 0;
int currentX = 0;
int currentY = 0;

//color stuff
String colorFreqPalette = "white";
boolean colorChosen = false;

//frequency analysis essentials
FFT freqAnalysis;
int frequencies = 1024;
// Define the frequencies wanted for our visualization.  Above that treshold frequencies are rarely atteigned and stay flat.
int freqWanted =  height;
// declare an array to store the frequency anlysis results in
float[] spectrum = new float[freqWanted];
// Declare a drawing variable for calculating the width of the
float circleWidth;

int sizeX = columns*sizeOfPixel;
int sizeY = rows*sizeOfPixel;

//serial communication setup
boolean startButton = false;

void setup() {
  size(640, 640);

  background(255);

  //String serialPortName = SerialUtils.findArduinoPort();
  //serialPort = new Serial(this, serialPortName, 9600);
  ////sender = new SerialRecord(this, serialPort, 8);
  //receiver = new SerialRecord(this, serialPort, 1);

  //input setup
  mic = new AudioIn(this, 0);
  mic.start();

  //loudness
  loudness = new Amplitude(this);
  loudness.input(mic);

  // use the microphone as the input for the analysis
  freqAnalysis = new FFT(this, frequencies);
  freqAnalysis.input(mic);
  startT = millis();
}


void draw() {
  if (colorChosen == true) {
    //if (receiver == 1){
    //  startButton = true;
    //}
    if (startButton == true) {
      t = millis();
      currentPosition = map(t - startT, 0, 10000, 0, width);
      println(t - startT);
      stroke(50);
      //line(currentPosition, 0, currentPosition, height);
      //println(currentX);

      // Adjust the volume of the audio input based on mouse position
      float inputLevel = map(mouseY, 0, height, 1.0, 0.0);
      mic.amp(inputLevel);

      float volume = loudness.analyze();
      int maxCurrentY = int(map(volume, 0, 0.7, 0, 8));

      //fft analyzze
      freqAnalysis.analyze(spectrum);



      float actualColor = 0;

      if (currentX > columns-1) {
        colorChosen = false;
        currentX = 0;
      }
      if (currentY > maxCurrentY-1) {
        currentY = 0;
      }

      actualColor = int(map(spectrum[spectrum.length-1]*8, 0, 0.05, 0, 255));
      arrayOfColors[currentX][currentY] = int(actualColor);
      //println(actualColor);
      matrixDisplay();

      currentY++;
      currentX = int(currentPosition/80);
    }
    else {
    background(255);
    textSize(50);
    fill(0);
    text("Press 's' to start",0, height/2);
    textSize(70);
    fill(255, 0,0);
    text("And scream!",0, height/2+100);
    }
  } else {
    background(255);
    textSize(50);
    fill(0);
    text("Choose the color", 0, height/2 - 50);
    fill(255, 0, 0);
    text("Press 'r' for red", 0, height/2);
    fill(0, 255, 0);
    text("Press 'g' for green",0, height/2 + 50);
    fill(0, 0, 255);
    text("Press 'b' for blue", 0, height/2 + 100);
    currentX = 0;
    currentY = 0;
  }
}


void keyPressed() {
  if (key == 'r') {
    colorFreqPalette = "red";
    colorChosen = true;
  } else if (key == 'g') {
    colorFreqPalette = "green";
    colorChosen = true;
  } else if (key == 'b') {
    colorFreqPalette = "blue";
    colorChosen = true;
  } else if (key == 'i') {
    colorFreqPalette = "ima";
    colorChosen = true;
  } else if (key == 's') {
    startButton = true;
  }
  background(0);
}

void matrixDisplay() {
  for (int i = currentX; i < columns; i++) {
    for (int j = 0; j < rows; j++) {
      if (colorFreqPalette == "red") {
        fill(arrayOfColors[currentX][currentY], 0, 0);
      } else if (colorFreqPalette == "green") {
        fill( 0, arrayOfColors[currentX][currentY], 0);
      } else if (colorFreqPalette == "blue") {
        fill(0, 0, arrayOfColors[currentX][currentY]);
      }
      rect(currentX*sizeOfPixel, currentY*sizeOfPixel, sizeOfPixel, sizeOfPixel);
    }
  }
}

there weren’t many colors available, but also, as i mentioned, the communication between two programs was flawed. so i decided to move on to the Arduino and make it somewhat independent as well.

when i started coding, i realized that my matrix was not really working properly, i had to bend it for it to actually work. i used toothpicks and hot glue to actually do that. so i was mostly “blindly” building my program for a couple of days. however, when i got my matrix to work, it seemed very good. then, i decided to reverse some of the functions: send the values about colorChoice, colorPalette, wether the program is finished or not and the currentStrip value from Arduino to the Processing. that worked well. spent quite a lot of time on some polishing details: to add the “indicator” white line in Arduino, figure out some stuff to save the artwork in a specific place and display it later without manipulating anything inside the computer:

I really liked that at that point my program was basically independent: i could press play in Processing and then people could just randomly enter the space, create the artwork, leave and then take a look at other people’s artwork using ’s’ (for slideshow) key on the computer, but also press ‘q’ (for quit) to continue drawing (and all of these past-created artworks would still be saved and displayed in the “slideshow mode”. 

all in all, the coding part was quite challenging, cause it is the first time I have been working with the matrix. plus, as i initially wanted to use sound (not buttons), i also wasted too much time on struggling with frequencies and things like that.

as for the fabrication part, i have created a box to put all the wiring in, which had laser-cut squares for buttons as well as the place for the matrix (that i ended up not using as the bend amount was too unpredictable). and some circles to get the sound int he loudness sensor.

i also created a massive frame using wood-cutter, fabric (that i sewed on it) and some other stuff that can be seen in the pictures below:

i spent quite a lot of time on that frame as well, and even though it turned out to be a bit confusing for people, i am very proud of it.

the fabric choice was inspired by the overall concept: stripes-drawing. they were vertically hanging (in different colors) just like the artworks created.

as for the stand, i did indeed create a certain part of it, however, most part was already done (I just borrowed it).

btw, why did i give up the sound? a lot of reasons.

  1. i did not find any alternatives to computer microphone in the ER or IT that would benefit my project. i rented the loudness sensor, however, it was not as sensitive as i wanted it to + when i put it in the box it was even worse as it was reading some of the button’s signals. i was trying to find some solutions to that, however there just wasn’t any, and as the deadline was approaching i decided to move on).
  2. frequency reading was too complicated and unpredictable to analyze (even with the computer audio). the amount of hours I spent on trying to solve this issue in the early stages of development is countless.
  3. i decided that even though some of the part of the interaction will be gone, i will still have some other powerful things: slideshow, the space, the buttons + the matrix. so i had both the touching element and visual representation two times.

anyway, as for my takeaways based on the performance:

if i had more time/done something differently i would:

  • put the projector somewhere inside/project not he outside of the space to create a bit less scattered-all-over-the-place piece
  • added more intuitive instructions
  • spent more time on figuring out how to draw each pixel instead of the stripe
  • added more buttons/colors? not sure
  • made slideshow independent of clicking “s”
  • added some saturation to the colors
  • added sound? this one – not sure

even though it did not appear very interesting/engaging to other people (as it seemed in class) I am really proud of the work I’ve done throughout these couple of weeks. i would never have imagined i would be able to do so much work in such a short time! i had a lot of fun fabrication the frame and coding!

examples of the artworks:

noStroke():

the instructions:

code from Processing:

import processing.sound.*;
import processing.serial.*;
import osteele.processing.SerialRecord.*;

int count = 0;
int count1 = 0;
String directory = "/Users/anyazhukova/Desktop/finalProject/finalProject3/data/";

boolean slideShowIsOn = false;

String gallery = "gallery";
String png = ".png";
String fullFileName = "";

Serial serialPort;
SerialRecord serialRecord;

int pixelsVert = 7;
int numberOfStrips = 8;

int sizeOfRect = 150;

int[] receiver = new int[4];

int currentStrip = 0;
int paintingFinishedArduino = 0;
int colorNumber = 0;
int colorPalette = 0;

boolean paintingNeedsToBeSaved = false;

int strip0start = 0;
int strip1start = sizeOfRect;
int strip2start = sizeOfRect*2;
int strip3start = sizeOfRect*3;
int strip4start = sizeOfRect*4;
int strip5start = sizeOfRect*5;
int strip6start = sizeOfRect*6;
int strip7start = sizeOfRect*7;

boolean newFillChosen = false;

//colorPalette: 1 - white, 2 - blue&green, 3 - blue&red, 4 - red&green, 5 - red, 6 - green, 7 - blue
void fillChoose() {
  noStroke();
  if (colorPalette == 1) {
    fill(colorNumber, colorNumber, colorNumber);
  }
  if (colorPalette == 2) {
    fill(0, colorNumber, colorNumber);
  }
  if (colorPalette == 3) {
    fill(colorNumber, 0, colorNumber);
  }
  if (colorPalette == 4) {
    fill(colorNumber, colorNumber, 0);
  }
  if (colorPalette == 5) {
    fill(colorNumber, 0, 0);
  }
  if (colorPalette == 6) {
    fill(0, colorNumber, 0);
  }
  if (colorPalette == 7) {
    fill(0, 0, colorNumber);
  }
  if (colorPalette == 0) {
    fill(0);
  }
}

void strip0display() {
  clear();
  for (int i = 0; i < sizeOfRect*7; i+=sizeOfRect) {
    fillChoose();
    rect(strip0start, i, sizeOfRect, sizeOfRect);
    fill(0);
  }
}

void strip1display() {
  for (int i = sizeOfRect*6; i >= 0; i-=sizeOfRect) {
    fillChoose();
    rect(strip1start, i, sizeOfRect, sizeOfRect);
    fill(0);
  }
}

void strip2display() {
  for (int i = 0; i < sizeOfRect*7; i+=sizeOfRect) {
    fillChoose();
    rect(strip2start, i, sizeOfRect, sizeOfRect);
    fill(0);
  }
}
void strip3display() {
  for (int i = sizeOfRect*6; i >= 0; i-=sizeOfRect) {
    fillChoose();
    rect(strip3start, i, sizeOfRect, sizeOfRect);
    fill(0);
  }
}

void strip4display() {
  for (int i = 0; i < sizeOfRect*7; i+=sizeOfRect) {
    fillChoose();
    rect(strip4start, i, sizeOfRect, sizeOfRect);
  }
}

void strip5display() {
  for (int i = sizeOfRect*6; i >= 0; i-=sizeOfRect) {
    fillChoose();
    rect(strip5start, i, sizeOfRect, sizeOfRect);
  }
}

void strip6display() {
  for (int i = 0; i < sizeOfRect*7; i+=sizeOfRect) {
    fillChoose();
    rect(strip6start, i, sizeOfRect, sizeOfRect);
  }
}

void strip7display() {
  for (int i = sizeOfRect*6; i >= 0; i-=sizeOfRect) {
    if (newFillChosen == true) {
      fillChoose();
    }
    rect(strip7start, i, sizeOfRect, sizeOfRect);
  }
  paintingNeedsToBeSaved = true;
  currentStrip = -1;
}

void displayAnalysis() {
  paintingFinishedArduino = receiver[1];
  if (paintingFinishedArduino != 2) {
    currentStrip = receiver[0];
    colorNumber = receiver[2]*120;
    colorPalette = receiver[3];
    newFillChosen = true;
  }
}


void setup() {
  size(1200, 1050);

  background(0);

  String serialPortName = SerialUtils.findArduinoPort();
  serialPort = new Serial(this, serialPortName, 9600);
  serialRecord = new SerialRecord(this, serialPort, 4);
}

void draw() {
  if (slideShowIsOn == false) {
    for (int i = 0; i < 4; i++) {
      serialRecord.read();
      receiver[i] = serialRecord.values[i];
    }
    displayAnalysis();
    if (currentStrip == 0) {
      fill(0);
      strip0display();
      fill(0);
    } else if (currentStrip == 1) {
      fill(0);
      strip1display();
      fill(0);
    } else if (currentStrip == 2) {
      fill(0);
      strip2display();
      fill(0);
    } else if (currentStrip == 3) {
      fill(0);
      strip3display();
      fill(0);
    } else if (currentStrip == 4) {
      fill(0);
      strip4display();
      fill(0);
    } else  if (currentStrip == 5) {
      fill(0);
      strip5display();
      fill(0);
    } else  if (currentStrip == 6) {
      fill(0);
      strip6display();
      fill(0);
    } else if (currentStrip == 7) {
      fill(0);
      strip7display();
      fill(0);
    }
    if (paintingFinishedArduino == 2 && paintingNeedsToBeSaved == true) {
      fullFileName = directory + gallery + str(count) + png;
      saveFrame(fullFileName);
      count++;
      clear();
      currentStrip = -1;
      paintingNeedsToBeSaved = false;
    }
  }
}

void slideShow() {
  String fileName = gallery + str(count1) + png;
  PImage img;
  img = loadImage(fileName);
  image(img, 0, 0);
}

void keyPressed() {
  if (count1 < count) {
    if (key == 's') {
      slideShowIsOn = true;
      slideShow();
      if (count1 < count-1) {
        count1++;
      }
    }
  }
  if (key == 'q') {
    slideShowIsOn = false;
    clear();
    count1 = 0;
  }
}

code Arduino:

#include <FastLED.h>

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>  // Required for 16 MHz Adafruit Trinket
#endif

// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 12  // On Trinket or Gemma, suggest changing this to 1

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 64  // Popular NeoPixel ring size

// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define DELAYVAL 0  // Time (in milliseconds) to pause between pixels

#define strip0start 0
#define strip1start 9
#define strip2start 16
#define strip3start 25
#define strip4start 32
#define strip5start 41
#define strip6start 48
#define strip7start 57

int currentStrip = 0;

bool strip0filled = false;
bool strip1filled = false;
bool strip2filled = false;
bool strip3filled = false;
bool strip4filled = false;
bool strip5filled = false;
bool strip6filled = false;
bool strip7filled = false;

bool colorsAssigned = false;
bool paintingFinished = false;
int paintingFinishedForProcessing = 1;

int startButtonCount = 0;

bool buttonStartPressed = false;
int buttonStartPin = 4;

bool buttonRedPressed = false;
int buttonRedPin = 5;

bool buttonGreenPressed = false;
int buttonGreenPin = 6;

bool buttonBluePressed = false;
int buttonBluePin = 7;

#include "SerialRecord.h"

int colorNumber = 0;

SerialRecord writer(4);

int loudnessPin = A0;
int loudness = 0;

//colorPalette: 1 - white, 2 - blue&green, 3 - blue&red, 4 - red&green, 5 - red, 6 - green, 7 - blue
int colorPalette = 0;


void strip0display() {
  for (int i = strip0start; i < strip0start + 7; i++) {  // For each pixel...
    loudness = analogRead(loudnessPin);
    colorNumber = int(map(loudness, 0, 500, 0, 64));
    if (buttonRedPressed == true && buttonGreenPressed == true && buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
      colorPalette = 1;
    } else if (buttonBluePressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
            colorPalette = 2;
    } else if (buttonBluePressed == true && buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
            colorPalette = 3;
    } else if (buttonRedPressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, 0));
      colorsAssigned = true;
      pixels.show();
      delay(200);
            colorPalette = 4;
    } else if (buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, 0));
      colorsAssigned = true;
      pixels.show();
      delay(200);
            colorPalette = 5;
    } else if (buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, 0));
      colorsAssigned = true;
      pixels.show();
      delay(200);
            colorPalette = 6;
    } else if (buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, 0, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
      colorPalette = 7;
    }
    writer[0] = currentStrip;
    writer[1] = paintingFinishedForProcessing;
    writer[2] = colorNumber;
    writer[3] = colorPalette;
    writer.send();
    pixels.show();  // Send the updated pixel colors to the hardware.
  }
  if (colorsAssigned == true) {
    currentStrip++;
    colorsAssigned = false;
  }
}

void strip1display() {
  for (int i = strip1start; i < strip1start + 7; i++) {  // For each pixel...
    loudness = analogRead(loudnessPin);
    colorNumber = int(map(loudness, 0, 500, 0, 64));
    if (buttonRedPressed == true && buttonGreenPressed == true && buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
      colorPalette = 1;
    } else if (buttonBluePressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
           colorPalette = 2;
    } else if (buttonBluePressed == true && buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
           colorPalette = 3;
    } else if (buttonRedPressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, 0));
      colorsAssigned = true;
      pixels.show();
      delay(200);
           colorPalette = 4;
    } else if (buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, 0));
      colorsAssigned = true;
      pixels.show();
      delay(200);
           colorPalette = 5;
    } else if (buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, 0));
      colorsAssigned = true;
      pixels.show();
      delay(200);
           colorPalette = 6;
    } else if (buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, 0, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
      colorPalette = 7;
    }
    writer[0] = currentStrip;
    writer[1] = paintingFinishedForProcessing;
    writer[2] = colorNumber;
    writer[3] = colorPalette;
    writer.send();
    pixels.show();  // Send the updated pixel colors to the hardware.
  }
  if (colorsAssigned == true) {
    currentStrip++;
    colorsAssigned = false;
  }
}

void strip2display() {
  for (int i = strip2start; i < strip2start + 7; i++) {  // For each pixel...
    loudness = analogRead(loudnessPin);
    colorNumber = int(map(loudness, 0, 500, 0, 64));
    if (buttonRedPressed == true && buttonGreenPressed == true && buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, colorNumber));
      colorsAssigned = true;
        colorPalette = 1;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, colorNumber));
      colorsAssigned = true;
        colorPalette = 2;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, colorNumber));
      colorsAssigned = true;
        colorPalette = 3;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, 0));
      colorsAssigned = true;
        colorPalette = 4;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, 0));
      colorsAssigned = true;
        colorPalette = 5;
      pixels.show();
      delay(200);
    } else if (buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, 0));
      colorsAssigned = true;
        colorPalette = 6;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, 0, colorNumber));
      colorsAssigned = true;
      colorPalette = 7;
      pixels.show();
      delay(200);
    }
    writer[0] = currentStrip;
    writer[1] = paintingFinishedForProcessing;
    writer[2] = colorNumber;
    writer[3] = colorPalette;
    writer.send();
    pixels.show();  // Send the updated pixel colors to the hardware.
  }
  if (colorsAssigned == true) {
    currentStrip++;
    colorsAssigned = false;
  }
}

void strip3display() {
  for (int i = strip3start; i < strip3start + 7; i++) {  // For each pixel...
    loudness = analogRead(loudnessPin);
    colorNumber = int(map(loudness, 0, 500, 0, 64));
    if (buttonRedPressed == true && buttonGreenPressed == true && buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, colorNumber));
      colorsAssigned = true;
      colorPalette = 1;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, colorNumber));
      colorsAssigned = true;
      colorPalette = 2;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, colorNumber));
      colorsAssigned = true;
      colorPalette = 3;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, 0));
      colorsAssigned = true;
      colorPalette = 4;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, 0));
      colorsAssigned = true;
      colorPalette = 5;
      pixels.show();
      delay(200);
    } else if (buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, 0));
      colorsAssigned = true;
      colorPalette = 6;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, 0, colorNumber));
      colorsAssigned = true;
      colorPalette = 7;
      pixels.show();
      delay(200);
    }
    writer[0] = currentStrip;
    writer[1] = paintingFinishedForProcessing;
    writer[2] = colorNumber;
    writer[3] = colorPalette;
    writer.send();
    pixels.show();  // Send the updated pixel colors to the hardware.
  }
  if (colorsAssigned == true) {
    currentStrip++;
    colorsAssigned = false;
  }
}

void strip4display() {

  for (int i = strip4start; i < strip4start + 7; i++) {  // For each pixel...
    loudness = analogRead(loudnessPin);
    colorNumber = int(map(loudness, 0, 500, 0, 64));
    if (buttonRedPressed == true && buttonGreenPressed == true && buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, colorNumber));
      colorsAssigned = true;
      colorPalette = 1;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, colorNumber));
      colorsAssigned = true;
      colorPalette = 2;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, colorNumber));
      colorsAssigned = true;
      colorPalette = 3;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, 0));
      colorsAssigned = true;
      colorPalette = 4;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, 0));
      colorsAssigned = true;
      colorPalette = 5;
      pixels.show();
      delay(200);
    } else if (buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, 0));
      colorsAssigned = true;
      colorPalette = 6;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, 0, colorNumber));
      colorsAssigned = true;
      colorPalette = 7;
      pixels.show();
      delay(200);
    }
    writer[0] = currentStrip;
    writer[1] = paintingFinishedForProcessing;
    writer[2] = colorNumber;
    writer[3] = colorPalette;
    writer.send();
    pixels.show();  // Send the updated pixel colors to the hardware.
  }
  if (colorsAssigned == true) {
    currentStrip++;
    colorsAssigned = false;
  }
}

void strip5display() {

  for (int i = strip5start; i < strip5start + 7; i++) {  // For each pixel...

    loudness = analogRead(loudnessPin);
    colorNumber = int(map(loudness, 0, 500, 0, 64));
    if (buttonRedPressed == true && buttonGreenPressed == true && buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, colorNumber));
      colorsAssigned = true;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, colorNumber));
      colorsAssigned = true;
            colorPalette = 3;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, 0));
      colorsAssigned = true;
            colorPalette = 4;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, 0));
      colorsAssigned = true;
      colorPalette = 5;
      pixels.show();
      delay(200);
    } else if (buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, 0));
      colorsAssigned = true;
            colorPalette = 6;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, 0, colorNumber));
      colorsAssigned = true;
      colorPalette = 7;
      pixels.show();
      delay(200);
    }
    writer[0] = currentStrip;
    writer[1] = paintingFinishedForProcessing;
    writer[2] = colorNumber;
    writer[3] = colorPalette;
    writer.send();
    pixels.show();  // Send the updated pixel colors to the hardware.
  }
  if (colorsAssigned == true) {
    currentStrip++;
    colorsAssigned = false;
  }
}

void strip6display() {
  for (int i = strip6start; i < strip6start + 7; i++) {  // For each pixel...
    loudness = analogRead(loudnessPin);
    colorNumber = int(map(loudness, 0, 500, 0, 64));
    if (buttonRedPressed == true && buttonGreenPressed == true && buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, colorNumber));
      colorsAssigned = true;
      colorPalette = 1;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, colorNumber));
      colorsAssigned = true;
          colorPalette = 2;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, colorNumber));
      colorsAssigned = true;
          colorPalette = 3;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, 0));
      colorsAssigned = true;
          colorPalette = 4;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, 0));
      colorsAssigned = true;
          colorPalette = 5;
      pixels.show();
      delay(200);
    } else if (buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, 0));
      colorsAssigned = true;
          colorPalette = 6;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, 0, colorNumber));
      colorsAssigned = true;
      colorPalette = 7;
      pixels.show();
      delay(200);
    }
    writer[0] = currentStrip;
    writer[1] = paintingFinishedForProcessing;
    writer[2] = colorNumber;
    writer[3] = colorPalette;
    writer.send();
    pixels.show();  // Send the updated pixel colors to the hardware.
  }
  if (colorsAssigned == true) {
    currentStrip++;
    colorsAssigned = false;
  }
}

void strip7display() {

  for (int i = strip7start; i < strip7start + 7; i++) {
    loudness = analogRead(loudnessPin);
    colorNumber = int(map(loudness, 0, 500, 0, 64));
    if (buttonRedPressed == true && buttonGreenPressed == true && buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, colorNumber));
      colorsAssigned = true;
         colorPalette = 1;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, colorNumber));
      colorsAssigned = true;
         colorPalette = 2;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true && buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, colorNumber));
      colorsAssigned = true;
         colorPalette = 3;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true && buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, colorNumber, 0));
      colorsAssigned = true;
         colorPalette = 4;
      pixels.show();
      delay(200);
    } else if (buttonRedPressed == true) {
      pixels.setPixelColor(i, pixels.Color(colorNumber, 0, 0));
      colorsAssigned = true;
         colorPalette = 5;
      pixels.show();
      delay(200);
    } else if (buttonGreenPressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, colorNumber, 0));
      colorsAssigned = true;
         colorPalette = 6;
      pixels.show();
      delay(200);
    } else if (buttonBluePressed == true) {
      pixels.setPixelColor(i, pixels.Color(0, 0, colorNumber));
      colorsAssigned = true;
      colorPalette = 7;
      pixels.show();
      delay(200);
    }
    writer[0] = currentStrip;
    writer[1] = paintingFinishedForProcessing;
    writer[2] = colorNumber;
    writer[3] = colorPalette;
    writer.send();
    pixels.show();  // Send the updated pixel colors to the hardware.
  }
  if (colorsAssigned == true) {
    currentStrip++;
    colorsAssigned = false;
    paintingFinished = true;
    paintingFinishedForProcessing = 2;

  }
}

int rainbow() {
  while(digitalRead(buttonStartPin) == 1){
    for(long firstPixelHue = 0; firstPixelHue < 16384; firstPixelHue += 256) {
     pixels.setBrightness(20);
    pixels.rainbow(firstPixelHue);
    pixels.show(); 
    }
  }
  pixels.clear();
    currentStrip = 0;
    paintingFinished = false;
    paintingFinishedForProcessing = 1;

  
  return(20);
}
void setup() {
  Serial.begin(9600);
  pinMode(buttonRedPin, INPUT);
  pinMode(buttonGreenPin, INPUT);
  pinMode(buttonBluePin, INPUT);
  pinMode(buttonStartPin, INPUT);

#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.

  pixels.begin();  // INITIALIZE NeoPixel strip object (REQUIRED)
}

void loop() {
  if (digitalRead(buttonStartPin) == 0) {
    buttonStartPressed = true;
    pixels.clear();
    currentStrip = 0;
    paintingFinished = false;
    paintingFinishedForProcessing = 1;
  } else {
    buttonStartPressed = false;
  }
  if (digitalRead(buttonRedPin) == 0) {
    buttonRedPressed = true;
  } else {
    buttonRedPressed = false;
  }
  if (digitalRead(buttonGreenPin) == 0) {
    buttonGreenPressed = true;
  } else {
    buttonGreenPressed = false;
  }
  if (digitalRead(buttonBluePin) == 0) {
    buttonBluePressed = true;
  } else {
    buttonBluePressed = false;
  }
  loudness = analogRead(loudnessPin);
  Serial.println(loudness);
  if (currentStrip == 0) {
    pixels.setPixelColor(7, pixels.Color(10, 10, 10));
    pixels.show();
    delay(1000);
    strip0display();
  }

  else if (currentStrip == 1) {
    pixels.setPixelColor(8, pixels.Color(10, 10, 10));
    pixels.show();
    delay(1000);
    strip1display();
  }

  else if (currentStrip == 2) {
    pixels.setPixelColor(23, pixels.Color(10, 10, 10));
    pixels.show();
    delay(1000);
    strip2display();
  }

  else if (currentStrip == 3) {
    pixels.setPixelColor(24, pixels.Color(10, 10, 10));
    pixels.show();
    delay(1000);
    strip3display();
  }

  else if (currentStrip == 4) {
    pixels.setPixelColor(39, pixels.Color(10, 10, 10));
    pixels.show();
    delay(1000);
    strip4display();
  }

  else if (currentStrip == 5) {
    pixels.setPixelColor(40, pixels.Color(10, 10, 10));
    pixels.show();
    delay(1000);
    strip5display();
  }

  else if (currentStrip == 6) {
    pixels.setPixelColor(55, pixels.Color(10, 10, 10));
    pixels.show();
    delay(1000);
    strip6display();
  }

  else if (currentStrip == 7) {
    pixels.setPixelColor(56, pixels.Color(10, 10, 10));
    pixels.show();
    delay(1000);
    strip7display();
    if (paintingFinished == true){
      writer[1] = paintingFinishedForProcessing;
      writer.send();
      delay(4000);
    //  int a = rainbow();
    }
  }
}
Categories
rapid prototyping weekly design discussions

10 principles of good design by Dieter Rams

First, I would like to confess that I do not entirely agree with Dieter Rams. Yes, as an appreciator of somewhat minimalistic and functional design, I prefer the kind of design Dieter Rams describe as a good design. However, I believe that sometimes very useless designs might bring joy to people just by having high aesthetic value (in their opinion).

That being said,  feel like a lot of the products developed by Newson and Rashid possess this aesthetic value that is one of the main reasons why people might want to buy their products.

Rashid has a very distinctive style that largely relies on bold geometric forms and saturated colors (and their combination). 

Marc Newson, while also having quite bold approach to colors and shape, seems to have a bit more experimental approach to shape (a lot of liquid-like, elegant shapes). 

From that perspective, both designers have a very high aesthetic value to their creations. 

As for the rest:

  • Innovativeness

I believe both artist embody a relatively innovative technology (where it is appropriate). I found it really hard to evaluate their products using this parameter.

  • Makes a product useful

I believe both designers probably make their product useful. At least for me nothing stood out as terribly unusable.

  • Understandable (User friendly)

By the looks of it – yes. But I believe this criteria could only be approached if the product is tested by yourslef.

  • Unobtrusive

Here, according to the design pricnciple, both designers fall short sometimes. The principle states that: “Products fulfilling a purpose are like tools. They are neither decorative objects nor works of art. Their design should therefore be both neutral and restrained, to leave room for the users self-expression.”

Which is not really the style of most of the products by both designers. A lot of other designs are much more “restrained and neutral”.

  • Honest

Pretty sure that in the reality of capitalism this is almost not feasible.

  • Long-lasting

Again, probably have to test it to actually comment on this one.

  • Thorough

Plenty of details in the products. However I would say that it would be wrong to say that NONE of the products have anything excessive. I am sure some of them have details that are just there to add to the visual value.

  • Environmentally friendly

Highly doubt that!

  • As little design as possible

Again, I believe there are a lot of things that could be “less” in both designers’ works.