To commoditize data of the deceased and create provocations around digital legacy.

Created: March 24th, 2018

0

Intention

Write about the big ideas behind your project? What are the goals? Why did you make it? What are your motivations?

We are interested in the practices around death, specifically cannibalism. [Note: This is a speculative design project.] We intend to make a hybrid site of remembrance that deals with both the physical and digital side of the deceased. The site of remembrance will take on the experience of dining. While deciding between a more passive or active method (i.e. school lunches versus a "conflict kitchen"), we settled on the latter because it's a better scope.

We are envisioning a room that the bereaved can go into to feast and as they are feasting, the smart room will both display the deceased's digital legacy and also serve meals that are reflective of that decease's feelings throughout their life (e.g. sour food for a bad period of their life).

We focused on the topic of cannibalism because it's taboo and we wanted something that's provocative. We also wanted to think more critically about what the equivalent will be in the digital space (i.e. digital cannibalism).

0

Context

Describe what informed your ideas and your outcome? How does your outcome relate to other work in the field? What are the precedent projects?

We reflected on our own funeral rituals (American, Vietnamese, and Korean) and found that feasting is part of all of them. 

We are running out of land and natural resources; meanwhile the earth is overcrowding. We pondered if these signals and trends might be the factor that shifts our mental models around cannibalism. For example, maybe burials will be illegal in the future because we are running out of land. This will cause an increase in alternative burial methods. We've seen alternative burial methods like cremation ashes turned into pencils or rocket fuels. We also see biodegradable burial pods that turns your body into a tree.

Another project that inspires us is Conflict Kitchen. It's a restaurant, but also a reflective and educational space. Conflict Kitchen serves cuisine from countries with which the United States is in conflict. On top of the dining aspect, the restaurant also puts on events, performances, and publications, that seek to engage the diner and public in discussions.

0

Process

Outline your approach to the project? What ideas did you generate and how did you refine or reject them? What did you research and explore? what were the design choices? What challenges were encountered and how did you resolve them?

We spend the majority of our time on conceptualizing. We settled on the idea of physical cannibalism, initially, because it was provocative, but then shifted more towards data cannibalism because it was a more subtle way to get our idea across. After a lot deliberation, we settled on a dystopia future where we have to deal with the overwhelming data of the deceased? Could that be commoditized and sold by the family of the deceased to make money?

After the concept development, we created a user flow and experience map of the main touch points. Then we moved on to prototyping and making.

We decided to go more with a playful visual style because the topic of death is already viewed in a such a taboo way in our society and we wanted to make it more approachable. 

0

Product

Detail what you created. What methods or techniques did you use? What tools and technologies were involved? Include images, code or video.

It's 2030 in Los Angeles, land of the rich and entertained. Our data diner sets place in the heart of the city. This is a place you can go to if you're feeling down and want to indulge in someone else's data to feel better. This is a place you go to to gain social weight.

Our project had five main components: the 3D model of the diner, the mobile app, the menu and food consumption interaction, and the physical table components (with the placemat projection, the individual hub, diner diner token, and food chips).

We have different types of seating arrangements: bar seats, booths, and private rooms. The rooms can be a more private space for people who are insecure about their devourings or want to pay more for privacy.

We chose the diner idea instead of a silver spoon restaurant because we wanted it to be accessible. This should be a place where people want to go to sell their data. It should also be a place that you want to go back to several times. The diner has both a sit down and a fast food element, which relates eating to the expediency of internet data and to the experience of digital legacy.


0

Reflection

Reflect on the process of making this project. What did you learn? What would you do differently?

We presented our projects to the class, Daragh Byrne, Stuart Candy, and Mary-Lou Arscott. In the future, we can think more about how many times the data can be replicated (is it just in one location, perhaps it is sourced locally). We would also think more about the supplicants and what the interaction for getting the data to the diner and turning it into the geometric shapes are. For example, where’s the backdoor for wheeling in the data? What would a take out window look like?

We would also look at variations. For example, what would a diet version look like? Is there an all you can eat option?

0

Wiring and Arduino Code : Diner Model

0
//--------NEOPIXEL SETUP --------
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
static const int PIN = 2;
static const int NUMPIXELS = 3;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//------------------------------


//------- TIMING --------
unsigned long lastSampleTime = 0;
unsigned long sampleInterval = 500; // in ms
//------------------------------


//------- PHOTO CELLS --------
const int photoOne = A0;
const int photoTwo = A1;

int oneReading;
int twoReading;

int oneMap;
int twoMap;

int lightVal = 400;

//------------------------------


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(photoOne, INPUT);
  pinMode(photoTwo, INPUT);

  pixels.begin();
  pixels.show();
}

void loop() {

  checkLight();

}

void checkLight() {
  unsigned long now = millis();
  if (lastSampleTime + sampleInterval < now) {
    lastSampleTime = now;

    oneReading = analogRead(photoOne); // hostess
    twoReading = analogRead(photoTwo); // table
    

    oneMap = map(oneReading, 0, 1023, 0, 500);
    twoMap = map(twoReading, 0, 1023, 0, 500);
  

    Serial.print("Photo One = ");
    Serial.println(oneMap);     // the raw analog reading

    Serial.print("Photo Two = ");
    Serial.println(twoMap);     // the raw analog reading



    if (oneMap <= lightVal) {
      pixelOn(0);
      pixelOff(1);
      pixelOff(2);
    } else if (twoMap <= lightVal) {
      pixelOn(1);
      pixelOff(0);
      pixelOff(2);
    } else if (oneMap > lightVal || twoMap > lightVal ){
      pixelOff(0);
      pixelOff(1);
      pixelOff(2);
    }


  }
}

void pixelOn(int n) {
  pixels.setPixelColor(n, (134, 235, 40));
  pixels.show();
}

void pixelOff(int n) {
  pixels.setPixelColor(n, (0, 0, 0));
  pixels.show();
}
Click to Expand
0

Wiring and Particle Photon Code: Tabletop "Data Hub"

0
//---------- RFID ------------
#include <MFRC522.h>
#define SS_PIN SS
#define RST_PIN D2
MFRC522 myRFID(SS_PIN, RST_PIN);	// Create MFRC522 instance.
String id = "";
String data_sent = "";
//------------------------------


//---------- PHOTOCELL ------------
static const int photoPin = A0;
int photoReading;
int photoMap;
int photoCount;
int lastPhotoCount;
//------------------------------


//---------- TIMING ------------
unsigned long lastSampleTime = 0;
unsigned long sampleInterval = 500; // in ms
//------------------------------

//-----OUTGOING-------
String sendState;

void setup() {
	// Initialize serial communications with the computer
	Serial.begin(9600);	
	
	myRFID.setSPIConfig(); // sets up SPI config
	myRFID.PCD_Init();	// Initialize RC522 card
	Serial.println("Start Scanning");
	
	pinMode(photoPin, INPUT);
	
}

void loop() {
    
    rfidSetup();
	socialChip();
	
}

void socialChip(){
    unsigned long now = millis();
  if (lastSampleTime + sampleInterval < now) {
    lastSampleTime = now;
    
    photoReading = analogRead(photoPin); // Social Chip initiation sensor
    photoMap = map(photoReading, 0, 1023, 0, 500);
    
    // Serial.print("Photo Value = ");
    // Serial.println(photoMap);     // the raw analog reading

    if (photoMap <= 1000) { // SENSOR IS DARK, CHIP IS PLACED
        photoCount = 1;
        // Serial.print("Photo Count = ");
        // Serial.println(photoCount);
        // data_sent = "dark_start";
        // Particle.publish("chip_sensor", data_sent, PRIVATE);
    } else if (photoMap > 1000){ // NO CHIP IS PRESENT
        photoCount = 0;
        // Serial.print("Photo Count = ");
        // Serial.println(photoCount);
        //  data_sent = "light_stop";
        // Particle.publish("chip_sensor", data_sent, PRIVATE); 
    }
    
    if (photoCount == 1 && lastPhotoCount == 0){
        sendState = 1;
        Serial.println(sendState);
        // data_sent = "start";
        // Particle.publish("chip_sensor", data_sent, PRIVATE); 
    } else if (photoCount == 0 && lastPhotoCount == 1){
        sendState = 7;
        Serial.println(sendState);
        // data_sent = "stop";
        // Particle.publish("chip_sensor", data_sent, PRIVATE); 
    }
    
    lastPhotoCount = photoCount;
    
  }
}

void rfidSetup(){
    
	// Look for new cards
    if ( ! myRFID.PICC_IsNewCardPresent()) { 
        return; 
    }
// Read tapped card data
    if ( ! myRFID.PICC_ReadCardSerial()) { 
        return; 
    }
    for (byte i = 0; i < myRFID.uid.size; i++) {
        // Create a RFID Hexdecimal String by adding and converting the binary
        id += String(myRFID.uid.uidByte[i], HEX);
    }
    id.toUpperCase(); // Convert to Uppercase
    // Print the RFID identifier to the Serial Port
    // Serial.print(id);
    
    if (id == "7BE73D7E") { // STARTER
        sendState = 2;
        Serial.println(sendState);
    }
    
    if (id == "B0DECE7A") { // MAIN
    sendState = 3;
        Serial.println(sendState);
    }
    
    if (id == "B0A9865B") { // SIDE 01
        sendState = 4;
        Serial.println(sendState);
    }
    
    if (id == "5B5D96BB") { // SIDE 02
        sendState = 5;
        Serial.println(sendState);
    }
    
    if (id == "1B903E7E") { // DESSERT
        sendState = 6;
        Serial.println(sendState);
    }
    
    // Reset Id
    id = "";
    // Serial.println();
    // Stop the reading after one tap
    myRFID.PICC_HaltA();
    /* Used to exit the PCD from its authenticated state. Remember to call this function after
    communicating with an authenticated PICC - otherwise no new communications can
    start .*/
    myRFID.PCD_StopCrypto1();
}
Click to Expand
0

Processing Code: Tabletop Projection

0
// Import Libraries for Video and Projection Mapping
import processing.video.*;
import deadpixel.keystone.*;
import processing.serial.*;

// The serial port
Serial myPort;  
// Keystone
Keystone ks;
// Create Surfaces to put media 
CornerPinSurface surface;
CornerPinSurface surface2;


// Movies and Images
Movie menu;

PImage starter; //2
PImage main; // 3
PImage side1; //4
PImage side2; //5
PImage dessert; //6
PImage defaultImg; //7

String id = "";
String buff = "";
// Create three screen to draw on
PGraphics offscreen;
PGraphics offscreen2;

// Switch screen on and off
boolean on1 = false;
boolean on2 = false;
boolean on3 = false;
boolean on4 = false;
boolean on5 = false;
boolean on6 = false;
boolean on7 = false;

//-----INCOMING VALUES-----
String incomingString; // setting string from serial 
int incomingState;
int swapState;

void setup() {
  // Keystone will only work with P3D or OPENGL renderers, 
  // since it relies on texture mapping to deform
  // Fullscreen 
  //fullScreen(P3D, 1); // FOR SCREEN ONE PROJECTOR
  fullScreen(P3D, 2); // FOR SCREEN TWO PROJECTOR
  //size(1500, 900, P3D);
  printArray(Serial.list());
  myPort = new Serial(this, Serial.list()[3], 9600);

  //// Load Movies for offscreen
  //movie = new Movie(this, "transit.mov");
  //movie.loop();
  //offscreen = createGraphics(640, 360, P3D);

  // Load images for menu interaction (CONVERT TO MOVIE)
  //menu = new Movie(this, "menu.mov");
  //menu.play();
  //offscreen2 = createGraphics(menu.width, menu.height, P3D);

  // Load images for MAIN DISH interaction (CONVERT TO MOVIE)
  main = loadImage("main.png");
  offscreen = createGraphics(main.width, main.height, P3D);

  // Load images for STARTER interaction (CONVERT TO MOVIE)
  starter = loadImage("starter.png");
  offscreen = createGraphics(starter.width, starter.height, P3D);

  // Load images for SIDE 01 interaction (CONVERT TO MOVIE)
  side1 = loadImage("side01.png");
  offscreen = createGraphics(side1.width, side1.height, P3D);

  // Load images for SIDE 02 interaction (CONVERT TO MOVIE)
  side2 = loadImage("side02.png");
  offscreen = createGraphics(side2.width, side2.height, P3D);

  // Load images for menu interaction (CONVERT TO MOVIE)
  dessert = loadImage("dessert.png");
  offscreen = createGraphics(dessert.width, dessert.height, P3D);

  // Load images for menu interaction (CONVERT TO MOVIE)
  defaultImg = loadImage("default.png");
  offscreen = createGraphics(defaultImg.width, defaultImg.height, P3D);

  //// Load Movie for offscreen3
  //movie2 = new Movie(this, "boidRME.mov");
  //movie2.loop();
  //offscreen3 = createGraphics(1920, 1080, P3D);

  // Create an instance of Keystone
  ks = new Keystone(this);

  surface = ks.createCornerPinSurface(main.width, main.height, 20);
  surface2 = ks.createCornerPinSurface(1080, 720, 20);
}

void draw() {
  background(0);
  while (myPort.available() > 0) {
    serialEvent(myPort.read());
  }

  sceneSwap();
}

void movieEvent(Movie m) {
  // read the video
  m.read();
}


void sceneSwap() {

  switch(swapState) {
  case 1:
    offscreen.beginDraw();
    offscreen.image(menu, 0, 0); 
    offscreen.endDraw();
    surface2.render(offscreen);
    break;
  case 2:
    offscreen.beginDraw();
    offscreen.image(starter, 0, 0); 
    offscreen.endDraw();
    surface.render(offscreen);
    break;
  case 3:
    offscreen.beginDraw();
    offscreen.image(main, 0, 0); 
    offscreen.endDraw();
    surface.render(offscreen);
    break;
  case 4:
    offscreen.beginDraw();
    offscreen.image(side1, 0, 0); 
    offscreen.endDraw();
    surface.render(offscreen);
    break;
  case 5:
    offscreen.beginDraw();
    offscreen.image(side2, 0, 0); 
    offscreen.endDraw();
    surface.render(offscreen);
    break;
  case 6:
    offscreen.beginDraw();
    offscreen.image(dessert, 0, 0); 
    offscreen.endDraw();
    surface.render(offscreen);
    break;
  case 7:
    offscreen.beginDraw();
    offscreen.image(defaultImg, 0, 0); 
    offscreen.endDraw();
    surface.render(offscreen);
    break;
  default:
    offscreen.beginDraw();
    offscreen.image(defaultImg, 0, 0); 
    offscreen.endDraw();
    surface.render(offscreen);
    break;
  }
}

void keyPressed() {
  switch(key) {
  case 'c':
    // enter/leave calibration mode, where surfaces can be warped 
    // and moved
    ks.toggleCalibration();
    break;

  case 'l':
    // loads the saved layout
    ks.load();
    break;

  case 's':
    // saves the layout
    ks.save();
    break;
  }
}

void serialEvent(int serial) {
  if (serial != '\n') { 
    buff += char(serial);
  } else {   
    id = trim(buff.substring(0));
    incomingState = int(id);
    if (incomingState == 1) { // MENU
      menu = new Movie(this, "menu.mov");
      menu.play();
      offscreen2 = createGraphics(menu.width, menu.height, P3D);
      swapState = 1;
    } else if (incomingState == 2) { // STARTER
      swapState = 2;
    } else if (incomingState == 3) { // MAIN
      swapState = 3;
    } else if (incomingState == 4) { // SIDE O1
      swapState = 4;
    } else if (incomingState == 5) { // SIDE 02
      swapState = 5;
    } else if (incomingState == 6) { // DESSERT
      swapState = 6;
    } else if (incomingState == 7) { // DEFAULT
      swapState = 7;
    }
    buff = "";
  }
  println(incomingState);
  println(swapState);
  println(" ");
}
Click to Expand
0

Mobile and Web Screen Examples: Diner Reservation and Menu Experience 

0

3D Model: Data Diner

0
There are three core seating / experience modes in the design. That of the booths, the bar and the private rooms with tables. These three elements each seek to serve not only different groups of people, but also different experiences wanted from private to semi public to public seating options. The corridors connecting these three different program elements are 6 feet wide is allow for two way passage. 
0

The traditional modes of the diner were integrated into the core structure of the building. The roof and the way it pinches itself along the middle axis and then angles itself upwards at the ends, was designed to not only bring character to the design, but also to indicate entry and exit points. 

0

Most apertures in the design are small and narrow. As the diner serves digital experiences, the interior needed to rely on less ambient lighting and avoid glare from direct sunlight. Therefore the apertures that are integrated into the structure are lined with horizontal shading panels.

x
Share this Project

Courses

48-528 Responsive Mobile Environments

· 12 members

The theme for 2018 will be the exploration of human memory and how digital and connected technology can support, augment, enhance, effect and alter the ways in which we remember, recount and reflec...more


About

To commoditize data of the deceased and create provocations around digital legacy.