Final Project: Make, Present & Report

Wake up as an Alzheimer’s patient.

Professor: Margarete Minsky

Yunyi Yang/Amelia Ji

CONCEPTION AND DESIGN:

Our project is about introducing Alzheimer’s disease to the public and letting people experience the life of an Alzheimer’s patient. It is a maze game, the gaze is a house of an Alzheimer’s patient house. You will wake up in the bedroom, and you must watch the maze on the screen and the physical place. If you get into the right room, the computer will display a piece of music and the right room’s light will turn on and there will be a text that told you what you are doing right now. And if you get into the wrong room, you will go back to the start, and the light will turn off and there will also have a text that told you you forget what you should do so you go back to the start. We want to use this game to simulate the life of those patients. 

During our research process, we first come up with this idea through a video and we get to know more about Alzheimer’s disease. And then, we talk to Minsky about our idea, Minsky thinks that if we make it like a gaze and make people go back to the start every time, it will be more like the symptom those patients have. Also, I think in that way the project will be more interactive because they need to focus on the project and play with it for a long time if they want to win. Also, I decided to add text and video, because it will make the game tell a story, and people can deepen their understanding of the story during the process of playing the game. During the user test. I found that if we don’t draw a maze on the screen and just let users explore in darkness, it will be too hard for them to play. Also, if there is no text on the screen, it is very difficult to express the idea of Alzheimer’s disease to them. So we did those things and it worked very well, in the presentation I think people can all understand what is the purpose of our project, and how it interacts with users to express our idea.

 

FABRICATION AND PRODUCTION:

We choose up/down/left/right bottom to control the ball moving in the gaze. But I think it is something that we can improve because it makes the project looks a little bit silly and too simple. Minsky suggests we use the code that has six statuses, and every instruction will be inside the statuses. This kind of code will be more logical and easy to recognize and easy to do changes. But we still choose to use the code that writes down every instruction separately, because we think we will not change the code, so it is also fine for us to write them separately. And we are just afraid it will be a big challenge for us to try new ways since there might be a lot of little mistakes that need to change. And we also choose to use 3D printing and laser cutting to make our house. What I did is that I finish part of the LED turn-on code and the whole LED turn-off code. I also write the code that lets processing send messages to Arduino. And I write the code about how Arudino can receive and read the value that sends from Arduino. In addition, I drew the line of the maze on the screen and add text to the maze. I also cut the radio into pieces. I also draw stop-motion animation.

CONCLUSIONS:

I think the interaction between users and my project has achieved my expectation. I can see they understand what they should do to interact with the project, and they can understand the theme we want to express, and they are moved by the story we are trying to tell. They did something to the machine and understand what happen and what they should do next gradually. I think it corresponds to my definition of interaction. If I have more time I will try the code Minsky mentioned because I think it will be very useful if I learned that code. And what is a success is that we made the project clear and designed it in a rational way. Also, I think I learn a lot of knowledge of coding through this project, now I can understand some basic logic of coding and some ways I can think about writing code. And I also learned that we need to put the experience of users first because it is the most important thing in an interaction project and only if you achieve that goal, you can express all your thoughts to others. 

ANNEX:

This is the Arduino code and the processing code:

#include "SerialRecord.h"

// Change this number to the number of values you want to receive
SerialRecord reader(1);

//FOR neopixel----//
int pos = 0;
#include 
//LED PIN
#define LED_PIN 9
// Information about the LED strip itself
#define NUM_LEDS 154
#define CHIPSET NEOPIXEL  //WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];  // Define the array of leds
//set brightness
#define BRIGHTNESS 3
//---------------------//
boolean on, blinking;
void setup() {
  Serial.begin(9600);
  delay(1000);
  FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
  // celebration3();
  reader.read();

  Serial.println(reader[0]);
  if (reader[0] == 0) {
    for (int i = 13; i > 12 && i < 44; i++) { leds[i] = CRGB::White; FastLED.show(); } } if (reader[0] == 1) { for (int i = 10; i > 9 && i < 13; i++) { leds[i] = CRGB::White; FastLED.show(); } for (int i = 44; i > 43 && i < 52; i++) { leds[i] = CRGB::White; FastLED.show(); } } if (reader[0] == 2) { leds[0] = CRGB::White; for (int i = 70; i > 69 && i < 85; i++) { leds[i] = CRGB::White; } for (int i = 149; i > 148 && i < 155; i++) { leds[i] = CRGB::White; } FastLED.show(); } if (reader[0] == 3) { leds[0] = CRGB::White; for (int i = 7; i > 6 && i < 9; i++) { leds[i] = CRGB::White; } for (int i = 53; i > 52 && i < 59; i++) { leds[i] = CRGB::White; } FastLED.show(); } if (reader[0] == 4) { leds[0] = CRGB::White; for (int i = 60; i > 59 && i < 65; i++) { leds[i] = CRGB::White; FastLED.show(); } for (int i = 1; i > 0 && i < 6; i++) { leds[i] = CRGB::White; FastLED.show(); } //FastLED.show(); } if (reader[0] == 5) { leds[0] = CRGB::White; for (int i = 114; i > 113 && i < 146; i++) { leds[i] = CRGB::White; } FastLED.show(); } if (reader[0] == 6) { leds[0] = CRGB::White; // for (int i = 146; i > 145 && i < 149; i++) { // leds[i] = CRGB::White; // } // for (int i = 85; i > 84 && i < 113; i++) {
    //     leds[i] = CRGB::White;
    //   }
    //   FastLED.show();
    // }
    if (reader[0] == 20) {
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = CRGB::Black;
      }
      FastLED.show();
    }
    if (reader[0] == 6) {
      // start blinking state
      blinking = true;
    }
    if (reader[0] == 88) {
      // stops blinking state
      blinking = false;
    }
    if (blinking && millis() % 1000 < 25) {
      if (on == true) {
        for (int i = 0; i < NUM_LEDS; i++) {
          leds[i] = CRGB::Black;
        }
        on = false;
      } else {
        for (int i = 0; i < NUM_LEDS; i++) {
          leds[i] = CRGB::White;
        }
        on = true;
      }
      FastLED.show();
    } else {
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = CRGB::Black;
      }
      FastLED.show();
    }
    delay(10);
  }
}
 
//color fillVal = color(126);

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

Movie mov;

SoundFile soundfile1;
SoundFile soundfile2;
SoundFile soundfile3;
SoundFile soundfile4;
SoundFile soundfile5;
SoundFile soundfile6;
SoundFile soundfile7;

Serial serialPort;
SerialRecord serialRecord;

int rad = 20;        // Width of the shape
float xpos, ypos;    // Starting position of shape
float mx;
float my;
int speed = 10;
int radius = 2;
int edge = 0;
int inner = edge + radius;
boolean b = false;
float prexpos;
float preypos;
//0 = bedroom, 1 = toliet, 2 = kitchen, 3 = dinning room, 4 = balcony, 5 = living room, 6 = study
int state = 0;


void setup()
{
  size(1100, 800);
  background(0);
  // Load a soundfile
  soundfile1 = new SoundFile(this, "soundfile1.mp3");
  soundfile2 = new SoundFile(this, "soundfile2.mp3");
  soundfile3 = new SoundFile(this, "soundfile3.mp3");
  soundfile4 = new SoundFile(this, "soundfile4.mp3");
  soundfile5 = new SoundFile(this, "soundfile5.mp3");
  soundfile6 = new SoundFile(this, "soundfile6.mp3");
  soundfile7 = new SoundFile(this, "soundfile7.mp3");

  mov = new Movie(this, "movie.mp4");
  //mov.play();
  noStroke();
  frameRate(30);
  ellipseMode(RADIUS);
  // Set the starting position of the shape
  xpos = 300;
  ypos = 700;

  String serialPortName = SerialUtils.findArduinoPort();
  serialPort = new Serial(this, serialPortName, 9600);

  // In order to send a different number of values, modify the number `2` on the
  // next line to the number values to send. In this case, the corresponding
  // number in the Arduino sketch should be modified as well.
  serialRecord = new SerialRecord(this, serialPort, 1);
}


void draw() {
  if (state == 6) {
    if (mov.available()) {
      mov.read();
    }
    image(mov, 0, 0, width, height);
  } else {
    background(0);
    fill(255);
    circle(xpos, ypos, rad);
    //keyPressed();
    prexpos = xpos;
    preypos = ypos;
   
    stroke(255);
    line(0, 270, 50, 270);
    
    stroke(255);
    line(150, 270, 540, 270);
    
    stroke(255);
    line(640, 270, 740, 270);
    
    stroke(255);
    line(370, 600, 430, 600);
    
    stroke(255);
    line(480, 600, 650, 600);
    
    stroke(255);
    line(700, 600, 910, 600);
    
    stroke(255);
    line(1000, 600, 1100, 600);
    
    stroke(255);
    line(370, 270, 370, 350);
    
    stroke(255);
    line(370, 450, 370, 730);
    
    stroke(255);
    line(550, 600, 550, 730);
    
    stroke(255);
    line(740, 0, 740, 90);
    
     stroke(255);
    line(740, 180, 740, 450);
    
    stroke(255);
    line(740, 550, 740, 730);
    
    
    
    
  }
   if (xpos<370 && xpos>0 && ypos>350 && ypos<730){
     textSize(50);
    fill(255);
    text("You are an alzheimer patient,",width/4,height/2);
    text("you had just woken up",350,500);
  }
  
  if (xpos<550 && xpos>370 && ypos>600 && ypos<800) {
     textSize(50);
    fill(255);
    text("And you realize you need to go to the bathroom",100,height/2);
  }
  
  if (xpos<740 && xpos>370 && ypos>270 && ypos<600){
     textSize(50);
    fill(255);
    text("After go to the bathroom, you cook for yourself",100 ,height/2);
  }
  
  
   if (xpos<740 && xpos>550 && ypos>600 && ypos<800){
     textSize(50);
    fill(255);
    text("You grab some tools", 300,height/2);
  }
  
  if (xpos<1100 && xpos>740 && ypos>600 && ypos<800){
     textSize(50);
    fill(255);
    text("And you go to the balcony to take care of the plants",0,height/2);
  }
  
  if (xpos<1100 && xpos>740 && ypos>0 && ypos<600){ textSize(50); fill(255); text("And you stay in the living room to watch televison",100,height/2); } if (ypos == 701 && xpos ==301){ textSize(50); fill(255); text("You go to the wrong room, and forget what to do,",90,600); text("so you go back to the bedroom",170,700); } //if (xpos == 550 && ypos>730 && ypos<800){ // textSize(50); // fill(255); // text("You go to the grocery, and forget what to do,",100,height/2); // text("so you go back to the bedroom",150,height/2); // } //if (ypos == 270 && xpos>540 && xpos<640){ // textSize(50); // fill(255); // text("You go to the study, and forget what to do,",100,height/2); // text("so you go back to the bedroom",150,height/2); // } // if (xpos == 370 && ypos>350 && ypos<450){ // textSize(50); // fill(255); // text("You go to the kitchen, and forget what to do,",100,height/2); // text("so you go back to the bedroom",150,height/2); // } // if (xpos == 740 && ypos>450 && ypos<550){ // textSize(50); // fill(255); // text("You go to the living room, and forget what to do,",100,height/2); // text("so you go back to the bedroom",150,height/2); // } } void keyPressed() { println(state); ////if ((b == true) && (key == CODED)) { // if (key == CODED) { // if (keyCode == UP) { // ypos = ypos - speed; // } else if (keyCode == DOWN) { // ypos = ypos + speed; // } // if (keyCode == LEFT) { // xpos = xpos - speed; // } else if (keyCode == RIGHT) { // xpos = xpos + speed; // } // xpos = constrain(xpos, inner, width - inner); // ypos = constrain(ypos, inner, height - inner); // fill(76); // //} // //b = false; //} } void keyReleased() { //b = true; if (key == CODED) { if (keyCode == UP) { ypos = ypos - speed; } else if (keyCode == DOWN) { ypos = ypos + speed; } if (keyCode == LEFT) { xpos = xpos - speed; } else if (keyCode == RIGHT) { xpos = xpos + speed; } xpos = constrain(xpos, inner, width - inner); ypos = constrain(ypos, inner, height - inner); fill(76); //} //b = false; } if (xpos>0 && xpos<1100 && ypos==0) { xpos = prexpos; ypos = preypos; } else if (xpos==740 && ypos>0 && ypos<90) { xpos = prexpos; ypos = preypos; } else if (xpos==740 && ypos>180 && ypos<450) { xpos = prexpos; ypos = preypos; } else if (ypos==270 && xpos>640 && xpos<740) { xpos = prexpos; ypos = preypos; } else if (ypos==270 && xpos>150 && xpos<540) { xpos = prexpos; ypos = preypos; } else if (xpos==370 && ypos>270 && ypos<350) { xpos = prexpos; ypos = preypos; } else if (ypos==270 && xpos>0 && xpos<50) { xpos = prexpos; ypos = preypos; } else if (xpos==0 && ypos>0 && ypos<800) { xpos = prexpos; ypos = preypos; } else if (ypos==800 && xpos>0 && xpos<1100) { xpos = prexpos; ypos = preypos; } else if (xpos==370 && ypos>450 && ypos<730) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>370 && xpos<430) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>480 && xpos<650) { xpos = prexpos; ypos = preypos; } else if (xpos==550 && ypos>600 && ypos<730) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>700 && xpos<740) { xpos = prexpos; ypos = preypos; } else if (xpos==740 && ypos>550 && ypos<730) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>740 && xpos<910) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>1000 && xpos<1100) { xpos = prexpos; ypos = preypos; } else if (xpos==1100 && ypos>0 && ypos<800) { xpos = prexpos; ypos = preypos; } else if (ypos == 270 && xpos>50 && xpos<150) { xpos = 301; ypos = 701; state = 20; serialRecord.values[0] = state; serialRecord.send(); } else if (xpos == 550 && ypos>730 && ypos<800) { xpos = 301; ypos = 701; state = 20; serialRecord.values[0] = state; serialRecord.send(); } else if (ypos == 270 && xpos>540 && xpos<640) { xpos = 301; ypos = 701; state = 20; serialRecord.values[0] = state; serialRecord.send(); } else if (xpos == 740 && ypos>450 && ypos<550) { xpos = 301; ypos = 701; state = 20; serialRecord.values[0] = state; serialRecord.send(); } else if (xpos == 370 && ypos>350 && ypos<450) {
    xpos = 301;
    ypos = 701;
    state = 20;
    serialRecord.values[0] = state;
    serialRecord.send();
  }
  if (xpos<370 && xpos>0 && ypos>350 && ypos<730) {
    state = 0;
    serialRecord.values[0] = state;
    serialRecord.send();
    
    
    if (soundfile1.isPlaying() == false) {
      soundfile1.play();
      soundfile2.stop();
      soundfile3.stop();
      soundfile4.stop();
      soundfile5.stop();
      soundfile6.stop();
      }
     
  }

  if (xpos<550 && xpos>370 && ypos>600 && ypos<800) {
    state = 1;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile2.isPlaying() == false) {
      soundfile2.play();
    }
    soundfile1.stop();
  }

  if (xpos<740 && xpos>370 && ypos>270 && ypos<600) {
    state = 2;
    serialRecord.values[0] = state;
    serialRecord.send();
    println(serialRecord.values[0]);
    if (soundfile3.isPlaying() == false) {
      soundfile3.play();
    }
    soundfile2.stop();
  }

  if (xpos<740 && xpos>550 && ypos>600 && ypos<800) {
    state = 3;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile4.isPlaying() == false) {
      soundfile4.play();
    }
    soundfile3.stop();
  }

  if (xpos<1100 && xpos>740 && ypos>600 && ypos<800) {
    state = 4;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile5.isPlaying() == false) {
      soundfile5.play();
    }
    soundfile4.stop();
  }

  if (xpos<1100 && xpos>740 && ypos>0 && ypos<600) {
    state = 5;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile6.isPlaying() == false) {
      soundfile6.play();
    }
    soundfile5.stop();
  }


  if (xpos<740 && xpos>0 && ypos>0 && ypos<270) {
    state = 6;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile7.isPlaying() == false) {
      soundfile7.play();
      soundfile6.stop();
      mov.play();
      float md = mov.duration();
      float mt = mov.time();
      if (mt == md){
        serialRecord.values[0] = 88;
        serialRecord.send();
    }
  }
}

}

Leave a Reply

Your email address will not be published. Required fields are marked *