FINAL PROJECT: Punch your Stress out

Design Concepts
Our project, initially called “Punch Art,” is a unique installation combining boxing and painting. It aims to stimulate creativity, encourage physical activity, and offer a fresh perspective on art and sport. The primary objective is to demonstrate how boxing can serve as a tool for creative expression while engaging participants in physical exercise. During the User Testing Session, we completed the buttons and achieved the desired drawing effect in the scene. However, users found it challenging to navigate solely by hitting the buttons, although they expressed satisfaction with the design. Taking user suggestions into account, we decided to change the project’s focus and create a stress-relief device, given the significant pressure everyone experienced during the final week. Users can release their stress by hitting the button, and the screen displays an effect reminiscent of whacking fruit to alleviate stress. To prevent monotony, we incorporated various scenes into the project, allowing users to choose their preferred fruit to punch. After testing different sensors, we determined that common buttons were the most effective and reliable choice. Consequently, we renamed the project “Punch your stress out” and centered it around the theme of a stress relief game.
 
 

Fabrication

During the fabrication phase of our project, we encountered several challenges that proved to be more complex than initially anticipated. The first hurdle was creating a stable button capable of withstanding the force of a punch. Professor Andy provided us with a large wooden board button as a solution. The button consisted of two wooden boards with copper tape on the inside surfaces. When the board was struck, the inner copper tape would make contact, creating a pathway. To begin, we utilized laser cutting to shape our buttons according to the provided plan.

However, in the first test, we faced difficulties in controlling the height between the two pieces and noticed that the button’s effectiveness varied depending on the location of impact. Despite creating four buttons to control the direction, we found them to be highly unstable, leading us to abandon this option.

We then explored an alternative approach for our buttons. We considered using simple buttons that did not require additional resistors for protection. In our toolbox, we had three-in-one buttons that fulfilled this requirement. We created a test button using these components, and it proved to be much more stable. Consequently, we placed an order for a batch of these buttons to proceed with our project. To enhance the user’s hitting experience, I designed the hitting surface of the button by filling it with cotton and cloth. Additionally, I cut slots in the back panel to accommodate the buttons, ensuring their strength and stability. We then mass-produced the remaining four buttons and conducted successful tests, yielding improved results compared to the original design.

Next, we encountered a second challenge: deter

mining the placement and arrangement of the buttons. Initially, we envisioned a vertical board where the buttons would be fixed on one wall. However, we realized this configuration was difficult to achieve for the display. Consequently, we had to explore alternative options. With the assistance of my fellow teammate, Kevin, I devised a method to secure the buttons using thick wooden boards. This approach enabled us to complete the structure of our project, marking the successful completion of the main fabrication stage. Subsequently, we turned our attention to developing the scenario code.

 

In the initial version of the demo, we employed simple brushes and a single pattern for movement. A sliding rheostat controlled the colors. However, as the painting patterns increased, we encountered limitations, as the color change could only be applied overall. To address this, we redesigned the version to achieve button-controlled movement, successfully implementing the desired effect. Additionally, I created the initial versions of the brushes and covers for the replacement patterns as part of our production process.

Scenario Design and Final Demo Preparation

Following the fabrication phase, our team transitioned to working on the scenario code for our project. In the initial version of the demo, we utilized simple brushes and a single pattern for movement.

To control the colors, we employed a sliding rheostat. However, as the complexity of the painting patterns increased, we encountered limitations with the color change, as it could only be applied uniformly. To address this, Haotong redesigned the system to achieve button-controlled movement, successfully implementing the desired effect.

As part of the production process, I designed the initial versions of the brushes and covers for the replacement patterns, enhancing the visual experience.

After conducting a user test of the initial version, we began the formal design process for our scenario and the development of our final demo. We initiated discussions to define the scenarios within our game and established a basic flow structure. This stage involved carefully planning the sequence of events, interactions, and visual elements to create an engaging and enjoyable experience for the users.

Sensor Calibration and Game Structure Development

With the assistance of Professor Andy, we conducted tests to determine the outliers and establish the appropriate range for the sensor’s values. Through this process, we ensured that the sensor functioned correctly, accurately registering a value of 1 or 0 from the Arduino, effectively emulating a button.

Once the sensor was calibrated, Haotong took the lead in developing the game structure using Processing. Haotong began by creating a state machine program that facilitated smooth transitions between different scenarios, aligning with the predetermined process established at the project’s outset. This state machine program formed the foundation of the game, providing a dynamic and engaging experience for the users as they interacted with various scenarios and gameplay elements.

void draw() {
  getSerialData();


  if (currentScene == 0) {
    scene0();
  } else if (currentScene == 1) {
    chooseBGS();
  } else if (currentScene == 2) {
    gameScene(bgidx);
  } else if (currentScene == 3) {
    closescene();
  }

  for (int i=0; i < NUM_OF_VALUES_FROM_ARDUINO; i++) {
    prev_arduino_values[i] = arduino_values[i];
  }
}

I helped with the functions for scene 0 and the ending scene.

void scene0() {
  getSerialData();
  int button = arduino_values[6];
  background(images[0]);
  //image(images[0], 0, 0, 1366, 1024);
  if (button != p_b && button ==1)  {
  currentScene = 1;
  delay(500);
  //lastTriggered = millis();
  }
    p_b = button;

  //if (lastTriggered != 0 && millis()-lastTriggered > 1000) {
  //  currentScene = 1;
  //}
}

Haotong, in collaboration with Professor Andy, conducted thorough tests to calibrate the sensor and establish the appropriate range for its values. By carefully analyzing the data and identifying outliers, we ensured the sensor’s accurate performance. With these adjustments in place, the sensor effectively functioned as a button, transmitting either a value of 1 or 0 from the Arduino.

Moving on to the development of the game structure, Haotong took the lead in utilizing Processing. The first step involved constructing a state machine program designed to seamlessly switch between different scenarios. This program, based on the initial process design, formed the core framework of the game. Its implementation allowed for dynamic and interactive gameplay experiences, providing users with an immersive and engaging environment to explore.

void chooseBGS() {
  getSerialData();
  int left6 = arduino_values[3];
  int right7 = arduino_values[4];
  int startv = arduino_values[6];
  background(images[1]);

  textSize(64);
  text(bgidx, 900, 330);
  fill(255, 0, 0);

  if (startv != 1) {
    if (arduino_values[3] == 1 && prev_arduino_values[3] == 0) {
    }
    if (left6 == 1 && pleft6 == 0) {
      bgidx  = bgidx - 1;
    }
    if (right7 == 1 && pright7 == 0) {
      bgidx = bgidx + 1;
    }
    if (bgidx >3) {
      bgidx = 1;
    }
    if (bgidx <1) {
      bgidx = 3;
    }
    pleft6 = left6;
    pright7 = right7;
  } else if (startv == 1 && p_b == 0) {
    currentScene = 2;
    delay(500);
  }
  p_b = startv;
}

Scene 2 presents the game content, where Haotong goes through the index obtained in Scene 1 to control the various backgrounds, brushes, and patterns. These elements serve the same purpose, but their mappings differ. The images follow an array data structure, allowing Haotong to organize them sequentially and implement a function to complete different scenes.

In the subsequent steps, Haotong retained the brush movement from the initial demo while addressing the issue of going out of bounds. Whenever the brush coordinates exceed the canvas size, they automatically adjust to fit within the canvas limits. Additionally, based on user testing suggestions, Haotong increased the step length for each brush movement, resulting in a smoother and easier gameplay experience.

Rather than altering the color of each hit, Haotong decided to modify their size. Consequently, the pattern left by each hit is stored in the corresponding array based on its coordinates and size. A for loop is utilized to iterate through the array’s data, which captures the contents of each drawing round on the current screen. When the screen switches to the next scene, the stored index resets to 0. Consequently, when the user engages in the next game, the new data automatically overwrites the previous one, enabling the program to continue without a restart.

void gameScene(int bgidx) {

  getSerialData();

  int color1 = arduino_values[0];
  int up4 = arduino_values[1];
  int down5 = arduino_values[2];
  int left6 = arduino_values[3];
  int right7 = arduino_values[4];
  int center8 = arduino_values[5];
  int startv = arduino_values[6];


  size1 = map(color1, 0, 1023, 50, 250);
  //color c1 = color(255, 0, 0); // 红色
  //color c2 = color(0, 0, 255); // 紫色



  background(images[bgidx+1]);
  penbrush(x, y, bgidx, size1+10);
  println(cidx);

  if (center8 == 1) {
    if (cidx < xs.length) {
      xs[cidx] = x;
      ys[cidx] = y;
      sizes[cidx] = size1;
      cidx++;
    }
  }


  for (int i = 0; i < cidx; i++) {
    pattern(xs[i], ys[i], sizes[i], bgidx);
  }

  if (x < 0){
    x = 0;
  }
  if (x > 1360){
    x = 1360;
  }
  if (y<0){
    y = 0;
  }
  if (y> 850){
    y= 850;
  }


  if (up4 == 1) {
    y -= 15;
  }
  if (down5 == 1) {
    y += 15;
  }
  if (left6 == 1) {
    x -= 15;
  }
  if (right7 == 1) {
    x += 15;
  }
  if (startv == 1 && p_b ==0) {
    currentScene = 3;
    cidx = 0;
    delay(500);
  }
  p_b = startv;
}

Here are the original paintings I drew for the blueberry scene:

For the orange scene:

Strawberry scene:

And after I decorated the appearance and hided all the wires, it looked quite good.

Conclusion

Our project was a resounding success, achieving the desired functionality and providing a seamless and engaging experience for users. The transitions between different scenes were smooth, capturing the interest and excitement of players. We received positive feedback on the main decompression aspect of the game, which was both interesting and enjoyable.

One of the key highlights of our project was the design of original canvases and patterns, which added a unique and visually appealing touch to the gameplay. These images were created exclusively for our project and required a significant amount of time and effort to develop. Their originality contributed to the overall quality and distinctiveness of our installation.

During the final IMA show, our installation attracted a lot of attention and generated a buzz among attendees. We were particularly delighted to see children lining up to play our game. The simplicity of the operation and the engaging percussion-based gameplay resonated well with the younger audience, providing them with a fun and interactive experience.

Throughout the production process, we encountered valuable lessons that will inform our future endeavors. We learned the importance of prototyping and thoroughly testing a product before proceeding with full-scale production. This approach ensures that any flaws or issues can be addressed early on, avoiding the need to start from scratch.

In terms of coding, we discovered the benefits of breaking down complex tasks into smaller, manageable components. This approach facilitated the debugging process and allowed us to focus on specific aspects individually. Additionally, having a well-defined project flow and structure greatly enhanced efficiency and fostered clear communication and collaboration among team members.

Looking ahead, given the opportunity, we have plans to further expand the functionality of our device by designing additional games. One exciting prospect is to develop a punch controller that can be used to control a wide range of games, offering users a diverse and immersive gaming experience. This expansion would enrich the versatility and appeal of our device, attracting a broader audience.

In conclusion, our project not only met but exceeded our expectations. The combination of original designs, smooth gameplay, positive user feedback, and valuable lessons learned positions us for continued success in future endeavors.

Team work

Our project was a resounding success, thanks to the diligent coding efforts of Haotong. She skillfully implemented the desired functionality, resulting in a seamless and engaging experience for users. The transitions between different scenes were smooth, capturing the interest and excitement of players. Haotong’s expertise and attention to detail ensured that the game operated flawlessly.

Appendix

 

Code: 

Arduino

int x = 0;
int y = 0;
int c = 0;
int button = 0;

const int Trig = 13;
const int Echo = 7;
int distance,time;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  int sensor0 = analogRead(A0);  //滑动变阻器
  int up = digitalRead(8);
  int down = digitalRead(9);
  int left = digitalRead(10);
  int right = digitalRead(11);
  int center = digitalRead(12);


  digitalWrite(Trig, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);
  time = pulseIn(Echo, HIGH);  
  distance = time / 58-2;

  if (distance > 15){
    button = 0;
    //Serial.print("11111");
    //Serial.print(distance);
    
  }
  else if (distance <= 15 && distance > 0){
    button = 1;
  }

//Serial.println(distance);
  Serial.print(sensor0);
  Serial.print(",");  // put comma between sensor values
  Serial.print(up);
  Serial.print(",");  // add linefeed after sending the last sensor value
  Serial.print(down);
  Serial.print(",");  // put comma between sensor values
  Serial.print(left);
  Serial.print(",");  // add linefeed after sending the last sensor value
  Serial.print(right);
  Serial.print(",");  // put comma between sensor values
  Serial.print(center);
  Serial.print(",");  // add linefeed after sending the last sensor value
  Serial.print(button);
  Serial.println();


  delay(30);
}

Processing 4

import processing.serial.*;
Serial serialPort;
import processing.video.*;
import processing.sound.*;

SoundFile sound;
int NUM_OF_VALUES_FROM_ARDUINO = 7;
int arduino_values[] = new int[NUM_OF_VALUES_FROM_ARDUINO];
int prev_arduino_values[] = new int[NUM_OF_VALUES_FROM_ARDUINO];
int x=600;
int y=300;
float size1 = 0;

float[] xs = new float[10000];
float[] ys = new float[10000];
float[] sizes = new float[10000];

int cidx = 0;

int currentScene = 0;

PImage[] images = new PImage[12];
int currentIndex = 0;
float imageSize = 0;
int bgidx = 1;
int p_S = 0;



void setup() {
  size(1366, 850);
  printArray(Serial.list());
  
  sound = new SoundFile(this, "song.mp3");
  sound.loop();


  images[0] = loadImage("mainpage.png");
  images[1] = loadImage("p1.jpeg");//zhuomian\
  
  images[2] = loadImage("p2.png");//lanmeizhuomian
  images[3] = loadImage("p3.png");//juzizhuomian
  images[4] = loadImage("p4.png");// caomeizhuomian
  
  images[5] = loadImage("p5.png");// lanmei bishua
  images[6] = loadImage("p6.png");//juzi bishua
  images[7] = loadImage("p7.png");// caomei bishua
  
  images[8] = loadImage("pa1.png"); //lanmei pattern
  images[9] = loadImage("pa2.png"); //juzi pattern
  images[10] = loadImage("pa3.png"); // caomei patterm
  
  images[11] = loadImage("last.png"); //jiewei
  for (int i = 0; i < 12; i++) {
    images[i].resize(1366, 850);
  }



  serialPort = new Serial(this, "/dev/cu.usbmodem11101", 9600);
}


void draw() {
  getSerialData();


  if (currentScene == 0) {
    scene0();
  } else if (currentScene == 1) {
    chooseBGS();
  } else if (currentScene == 2) {
    gameScene(bgidx);
  } else if (currentScene == 3) {
    closescene();
  }

  for (int i=0; i < NUM_OF_VALUES_FROM_ARDUINO; i++) {
    prev_arduino_values[i] = arduino_values[i];
  }
}

int lastTriggered = 0;
int p_b = 0;

void scene0() {
  getSerialData();
  int button = arduino_values[6];
  background(images[0]);
  //image(images[0], 0, 0, 1366, 1024);
  if (button != p_b && button ==1)  {
  currentScene = 1;
  delay(500);
  //lastTriggered = millis();
  }
    p_b = button;

  //if (lastTriggered != 0 && millis()-lastTriggered > 1000) {
  //  currentScene = 1;
  //}
}

int pleft6 = 0;
int pright7 = 0;

void chooseBGS() {
  getSerialData();
  int left6 = arduino_values[3];
  int right7 = arduino_values[4];
  int startv = arduino_values[6];
  background(images[1]);



  textSize(64);
  text(bgidx, 900, 330);
  fill(255, 0, 0);



  if (startv != 1) {
    if (arduino_values[3] == 1 && prev_arduino_values[3] == 0) {
    }
    if (left6 == 1 && pleft6 == 0) {
      bgidx  = bgidx - 1;
    }
    if (right7 == 1 && pright7 == 0) {
      bgidx = bgidx + 1;
    }
    if (bgidx >3) {
      bgidx = 1;
    }
    if (bgidx <1) {
      bgidx = 3;
    }
    pleft6 = left6;
    pright7 = right7;
  } else if (startv == 1 && p_b == 0) {
    currentScene = 2;
    delay(500);
  }
  p_b = startv;
}


void gameScene(int bgidx) {

  getSerialData();

  int color1 = arduino_values[0];
  int up4 = arduino_values[1];
  int down5 = arduino_values[2];
  int left6 = arduino_values[3];
  int right7 = arduino_values[4];
  int center8 = arduino_values[5];
  int startv = arduino_values[6];


  size1 = map(color1, 0, 1023, 50, 250);
  //color c1 = color(255, 0, 0); // 红色
  //color c2 = color(0, 0, 255); // 紫色



  background(images[bgidx+1]);
  penbrush(x, y, bgidx, size1+10);
  println(cidx);

  if (center8 == 1) {
    if (cidx < xs.length) {
      xs[cidx] = x;
      ys[cidx] = y;
      sizes[cidx] = size1;
      cidx++;
    }
  }


  for (int i = 0; i < cidx; i++) {
    pattern(xs[i], ys[i], sizes[i], bgidx);
  }

  if (x < 0){
    x = 0;
  }
  if (x > 1360){
    x = 1360;
  }
  if (y<0){
    y = 0;
  }
  if (y> 850){
    y= 850;
  }


  if (up4 == 1) {
    y -= 15;
  }
  if (down5 == 1) {
    y += 15;
  }
  if (left6 == 1) {
    x -= 15;
  }
  if (right7 == 1) {
    x += 15;
  }
  if (startv == 1 && p_b ==0) {
    currentScene = 3;
    /*
    for (int i = 0; i < cidx; i++) {
     
     sizes[cidx]=0;
     xs[i]=-100;
     ys[i]=-100;
     }
     */
    cidx = 0;
    delay(500);
  }
  p_b = startv;
}


void closescene() {
  getSerialData();
  int startv = arduino_values[6];

  //image(images[3], 0, 0, 1366, 1024);
  background(images[11]);
  if (startv == 1 && p_b == 0) {
  
    currentScene = 0;
    //p_b = 0;
    delay(300);
  }
  p_b = startv;
}




void penbrush(int cx, int cy, int idx, float size1) {
  imageMode(CENTER);
  image(images[idx+4], cx, cy, size1, size1);
}





void pattern(float cx, float cy, float size1, int idx) {
  imageMode(CENTER);
  image(images[idx+7], cx, cy, size1+30, size1+30);
}




void getSerialData() {
  while (serialPort.available() > 0) {
    String in = serialPort.readStringUntil( 10 );  // 10 = '\n'  Linefeed in ASCII
    if (in != null) {
      print("From Arduino: " + in);
      String[] serialInArray = split(trim(in), ",");
      if (serialInArray.length == NUM_OF_VALUES_FROM_ARDUINO) {
        for (int i=0; i<serialInArray.length; i++) {
          arduino_values[i] = int(serialInArray[i]);
        }
      }
    }
  }
}

MIDTERM PROJECT: FISHING TIME!

FISHING TIME! 

— Alyssa and Haotong Wu

Interaction Lab, Professor Margaret

3/19/2023

Tile:  Fishing Time!

Team Members: Alyssa, Haotong Wu

Instructor Name: Margerat

Context and Significance: The fishing simulator project was inspired by a device that uses a mechanical pulley structure. We aimed to build a fishing simulator that mimics a real fishing experience and enhances user interaction by allowing them to put on baits, control the auto-motor, and take up and roll out the fish tape. Our project aimed to increase user engagement by introducing a range of difficulty levels that develop users’ patience, and a counting device that adds interactivity. We also aimed to make the project user-friendly, convenient for both left and right-handed users, and easy to use with a magnet instead of a hook.

Conception and Design: To achieve our objectives, we divided the project into three components: a fishing rod, a turntable, and a console with a basket. I was responsible for the model design and production, while Haotong was in charge of the circuitry and coding. We used an eight-digit LED to display the fish count, and a buzzer to indicate when the user caught a fish. We also included a button to reset the count. The fishing rod was designed to be held conveniently by both left and right-handed users and attached to the side of the pool to achieve smooth use. We used a magnet instead of a hook, making it easy to hook small fish.

 

Fabrication and Production:

We faced challenges while building the fishing simulator, especially when connecting the eight-digit LED. However, with help from our professor and research on Arduino, we were able to understand the connection and make it work. We used cardboard to create the structure of the fishing simulator, including the pool, turntable, and console. We used the CNC machine to cut the cardboard pieces into the desired shapes, and glued them together to create the final product. We also programmed the circuitry to control the motor and count the number of fish caught.

Rod prototyping:

We started the prototyping process for the fishing rod by first identifying the materials we would use. Since our goal was to create an affordable and accessible fishing simulator, we decided to use cardboard as our main material. After gathering the necessary materials, we began sketching and cutting out the various parts of the rod, including the handle and the reel seat. We then started assembling the parts, making sure that they were sturdy and aligned properly. We found that the cardboard material was easy to work with and allowed us to iterate quickly on the design. After several rounds of prototyping, we settled on a design that was lightweight, easy to handle, and could accommodate both left and right-handed users.

 

In the process of designing and prototyping the fishing rod, we encountered an issue regarding its handle. Traditionally, fishing rods are designed to be held with the dominant hand, which is usually the right hand. However, this design poses an inconvenience for left-handed individuals. Therefore, we decided to make our fishing rod user-friendly for both left and right-handed users.

To accomplish this, we modified the design of the handle. We borrowed the method from a YouTube video for making the fishing rod, but we did not fix the fishing line. Instead, we used a straw to build a track for the fishing line. This way, both left-handed and right-handed users can use the fishing rod comfortably. This way, users can hold the fishing rod with their dominant hand and use the other hand to control the fishing line. 

youtube video link: https://www.youtube.com/watch?v=YCUM22YYSE4

Overall, the design and fabrication process of the fishing rod allowed us to create a user-friendly and functional product that can be used by both left and right-handed individuals.

turntable prototyping:

Moving on to the spinning plate, we designed a round cardboard covered with green paper to simulate the look of a lotus leaf. The plate was placed in the center of the pool, and stuffed cloth fish were placed on top of it. The plate was rotated by a servo motor, which we programmed to change direction when its position was over or equal to 180 degrees. We wanted to incorporate a button to control the playing level, but during the coding process, we discovered that we could change the speed of the spinning plate every time the fish count increased. As a result, we were able to achieve the process of leveling up without needing a separate button.

Stuffed cloth fish prototyping:

To create the stuffed cloth fish, we used a sewing machine to sew the fabric into fish shapes, leaving a small opening to fill them with stuffing. We chose a variety of colors and patterns to make the fish visually appealing. The magnets used for the fishing hooks were also sewn into the mouth area of each fish. This allowed the magnets to be concealed while still effectively catching the fish.

Magnet testing:

Overall, the cardboard prototyping process allowed us to quickly and easily test and modify our design. The stuffed cloth fish were a fun and creative way to add an interactive element to the game. The use of the servo motor and magnets for the fishing hooks added a level of sophistication and complexity to the game, making it engaging for all levels of players.

Programming process:

Firstly, Haotong tried to use the light sensor to count the number of fish. To increase the interaction and to make users easy to understand, we decided to use the eight-digit LED, which can show the number on it. But this component is really hard to use and connect. Initially, Haotong simplified the circuit and only used one LED and a buzzer to achieve the counting function. After asking the professor for help, and searching the knowledge in the Arduino, we know that an eight-dight LED can be understood as eight common LEDs. So we reconnected the circuit, and it worked well.

Upgrade version with eight-dight LED:

First simple version:

 

And then, Haotong added the servo motor, which can change the direction when the position is over or equal to 180. Firstly, we want to use a button to control the playing level, but when Haotong was writing the code, she found a good way to change the speed; every time count+1, the speed will also add, so this can achieve the process of leveling up. During user testing, we found that the light sensor was very unstable and there was a bug that the counter would keep counting as long as the fish was not moved. The light sensor will record the resistance value of the current environment at each start-up and then have a fixed amount of change, and whenever the initial value plus the amount of change is exceeded, then it will count. But the amount of change selected is also very unstable, and the degree of stability is also related to the color of the small fish. We laid a layer of reflective paper under the basket, so that not only can increase the environmental brightness, but also can increase the decorative nature. What’s more, Haotong increased the delay for each count and added a flag2 to determine if the fish was removed. She debugged the best time interval based on testing so that she wouldn’t have to put in a fish and count it multiple times.

And during user testing, it was suggested that a timing feature could be added. So Haotong added the mills function to the code. But it counts every time from the beginning of the program. She found inspiration from the light sensor to add a variation based on the change of flag to determine whether the time reaches the specified value.

Conclusions:

The fishing simulator project was a challenging and exciting experience for both of us. We learned a lot about circuitry and coding, and how to use different components to achieve our objectives. We also learned how to work collaboratively and divide tasks efficiently. Our project achieved its objectives of mimicking a real fishing experience and enhancing user interaction. The project’s unique features, including the magnet instead of a hook and the eight-digit LED, made it more user-friendly and engaging.

Our project was a success in terms of creating a functional and engaging fishing game device. Throughout the prototyping process, we encountered several challenges and had to pivot our designs to make the project work. Our cardboard prototyping was a critical part of the process, allowing us to quickly and cost-effectively test out different designs for the fishing rod, spinning plate, and fish trap. It also helped us identify potential issues early on, such as the need to make the fishing rod usable for both left and right-handed individuals.

Overall, we are pleased with the final product and believe it has the potential to spark interest in fishing among a broader audience. If we had more time, we would have liked to explore additional features for the fishing rod, such as the ability to attach one’s own bait. We also acknowledge the need to provide clearer instructions for users to avoid putting the fishing rod directly into the hole instead of removing the fish by hand.

Throughout the project, we learned the importance of collaboration and leveraging each other’s strengths. As partners, we were able to balance design, production, and coding tasks, and provide feedback and support along the way. Ultimately, we are proud of the final result and believe it demonstrates the power of prototyping to quickly iterate and refine ideas.

Annex: For the project, we used the following components:

  • Arduino Uno R3 board
  • Step motor
  • Eight-digit LED
  • Buzzer
  • Button
  • Light sensor
  • Round magnets
  • Cardboard
  • Glue
  • Cloth

Here are videos about our device in three different situations:

  1. Failed to catch eight fishes in 60s, when time is up, yellow led lights up, buzzer makes “beeeeeep” noise.

 

2. Successfully catch eight fish within 60s. A short clip of ,music will play through the buzzer.

3. Just want to tryout the device, quit half way.

Making and testing process:

Details of the device:

We also included the circuit diagram and the code used for programming the fishing simulator.

The following code is done by Haotong with help from professors:

#include 
#include "pitches.h"
Servo myservo;  //

int y = 0;  //resistor of light sensor
int y_n = 0; // the delta of light sensor
int count = 0;
int bottom = 0;       //reset button
int levelBottom = 0;  //stop button
int pos = 0;
int speed = 5;
int flag = 0;// to determine whether the device is running or not

int flag2 = 0;//prevent the counting function from running when one round doesn't finish

int music[] = { NOTE_C4, NOTE_B3, NOTE_E2, NOTE_E2, NOTE_E2, NOTE_E2, NOTE_D2, NOTE_G2, NOTE_E2 };
int noteDurations[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4 };
unsigned long startTime;
unsigned long endTime;

void setup() {
  // put your setup code here, to run once:
  pinMode(12, OUTPUT);
  pinMode(8, OUTPUT);   //8是右亮
  pinMode(9, OUTPUT);   //9右下亮
  pinMode(10, OUTPUT);  //10 上
  pinMode(11, OUTPUT);  //11中间
  pinMode(13, OUTPUT);  //13左下
  pinMode(7, OUTPUT);   //7下
  pinMode(6, OUTPUT);   //6右上
  pinMode(3, OUTPUT);   //time
  Serial.begin(9600);
  myservo.attach(5);
}

void loop() {
    
  // put your main code here, to run repeatedly:
  
  if (flag == 1){
    endTime = millis();
  }

  if (y_n == 0) {
    y_n = analogRead(A0);
    y_n = y_n + 120;
  }
  bottom = analogRead(A1);
  levelBottom = analogRead(A2);


  if (millis()- startTime >= 60000 && flag == 1 ) {
    digitalWrite(3, HIGH);
    tone(12, 500);
    delay(2300);
    noTone(12);
    digitalWrite(3, LOW);
    flag = 0;
    startTime = millis();
    // 
    
    
  }

  

  if ((bottom > 1000) && (flag == 0)) {
    flag = 1;  //maybe can remove
    startTime = millis();
    y_n = 0;    
  }

  if (levelBottom > 1000) {
    flag = 0;
    count = 0;
    y_n = 0;
  }



  pos = pos + speed;
  if (pos >= 180) {
    pos = 180;
    speed = speed * -1;
  } else if (pos <= 0) { pos = 0; speed = speed * -1; } if (flag == 1) { // Serial.print("Servo: "); // Serial.println(pos); myservo.write(pos); } //myservo.write(pos); // tell servo to go to position in variable 'pos' if (bottom > 1000) {

    count = 0;
    flag = 1;
    speed = 5;
  }
  y = analogRead(A0);
  //Serial.println(y);
  Serial.println(bottom);
  if ((((y > y_n)&& (flag == 1)))&&(flag2 == 0)) {
    //digitalWrite(8,High);
    flag2 = 1;
    if (count == 1) {
      tone(12, 300);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      delay(1000);
      //digitalWrite(8, HIGH);
      //digitalWrite(9, HIGH);
      noTone(12);
      delay(800);
    }
    if (count == 2) {
      tone(12, 400);
      digitalWrite(8, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(13, LOW);
      digitalWrite(7, LOW);
      delay(1000);
      //digitalWrite(8, HIGH);
      //digitalWrite(10, HIGH);
      //digitalWrite(11, HIGH);
      //digitalWrite(13, HIGH);
      //digitalWrite(7, HIGH);
      noTone(12);
      delay(800);
    }
    if (count == 3) {
      tone(12, 500);
      digitalWrite(8, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(9, LOW);
      digitalWrite(7, LOW);
      delay(1000);
      //digitalWrite(8, HIGH);
      //digitalWrite(10, HIGH);
      //digitalWrite(11, HIGH);
      //digitalWrite(9, HIGH);
      //digitalWrite(7, HIGH);
      noTone(12);
      delay(800);
    }
    if (count == 4) {
      tone(12, 600);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(11, LOW);
      delay(1000);
      //digitalWrite(6, HIGH);
      //digitalWrite(8, HIGH);
      //digitalWrite(9, HIGH);
      //digitalWrite(11, HIGH);
      noTone(12);
      delay(800);
    }
    if (count == 5) {
      tone(12, 700);
      digitalWrite(6, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(9, LOW);
      digitalWrite(7, LOW);
      delay(1000);
      //digitalWrite(6, HIGH);
      //digitalWrite(10, HIGH);
      //digitalWrite(11, HIGH);
      //digitalWrite(9, HIGH);
      //digitalWrite(7, HIGH);
      noTone(12);
      delay(800);
    }
    if (count == 6) {
      tone(12, 800);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(11, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(13, LOW);
      delay(1000);
      //digitalWrite(6, HIGH);
      //digitalWrite(10, HIGH);
      //digitalWrite(11, HIGH);
      //digitalWrite(9, HIGH);
      //digitalWrite(7, HIGH);
      //digitalWrite(13, HIGH);
      noTone(12);
      delay(800);
    }
    if (count == 7) {
      tone(12, 900);
      digitalWrite(10, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      delay(1000);
      //digitalWrite(10, HIGH);
      //digitalWrite(8, HIGH);
      //digitalWrite(9, HIGH);
      noTone(12);
      delay(800);
    }
    if (count == 8) {
      tone(12, 1000);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(13, LOW);
      delay(1000);
      noTone(12);
      for (int thisNote = 0; thisNote < 9; thisNote++) { tone(12, music[thisNote], noteDurations); delay(400); noTone(12); flag = 0; } } count = count + 1; if ((speed >= 0) && (count > 1)) {
      speed = speed + 2;
    } else {
      speed = speed - 2;
    }


    if (count == 10) {
      count = 0;
      flag = 0;
      speed = 5;
    }

  } else {
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(11, HIGH);
    digitalWrite(13, HIGH);
    delay(100);
    flag2 = 0;
  }
  //delay(10000);
}

GROUP RESEARCH PROJECT REPORT

Initial idea:

Our initial idea of this project is to creat a device that is able to recreate scence but without risking  what happened in The Veldt. So we came up with an idea of creating a pair VR glasses and glove( it provide the sense of touching) instead of a whole room, so that the tragety will not happen in this case.

Its working principle is, when you turn the device on, it will start to record the scene that you want it to store and replay later, and when you want it to do so, you can simply put it back on, and it will re-show you the scene in viewing, listening, and touching.

 

This is the initial draft of our device, showing how the glasses work.
 
This is the fist version of the glasses prototyping, made by Denny. It shows the general idea and shape of the glasses.
 
This is the first version of the arm part which function as the central control unit, and some elemts of the hand controler.
this is the final version of the glasses and the hand controler done by me and with help of MJ.
this is the try on of the final version of the  prototyping.
 
And here is the video of our final perforamce.

critical analysis and assessment of a performance of group 1’s perforamce.

 

Start with the description of the project. How relevant/not relevant is the interactive artifact to the fictional story? How well/not well does it meet the criteria of the assignment? What is your opinion of the design of the device? How creatively does the performance help you understand the artifact? Do you have any suggestions for improvements?

This short performance shows a scene of what it would be like with or without the “subtile showing mask” in the epidemic time in The Plague. It shows how it can avoid misunderstanding and friendly fire situation by using the masks to help the elders to understand what the soldiers were saying. I think it is pretty relevant to the story considering that it is in the background of the story. And it is alsovery creative to print out the subtitle from the mouth part of the masks.  And the performance is helpful for me to understand what the “printer” on the mouth is for because before the performance I thought it is just a decoration. 

I think it would be better if they don’t seperate the whole story into two situations, which are without and with the masks, because personally I think it makes the performace kind of disengaging by saying “It would different with this new device…”. The officers can directly put the masks on after realising the old guy has hearing problem, which would makes the performance more fluently.