The concept behind the first iteration of our project was a boxing game where users control the arms of a boxer through buttons to strike a “punching bag” that moves linearly in front of the boxer.

Interaction Analysis

Interactions that were most surprising were when kids found it more enjoyable to press the buttons just to have the arms move rather than work towards the goal of having the arm strike the punching bag. Children also thought that continuously pressing the buttons would make the arms go faster, which was not the case. Additional features which would help visitors perceive more of the purpose include making the “punching bag” mechanism more legible. With the current design, it does not seem to be clear to users that the punching bag was meant to serve as a target, hence why there was less focus on striking the punching bag. The visit to the museum did not really change our final visions, but we would focus more on making components more legible to the user so that the project’s intended purpose would be more clear to them.

Engineering Analysis

A technical failure was that we were not able to get a sound to play when the punching bag is struck. Our original plan involved having a photosensor installed in the middle of the punching bag so that when an arm strikes the photosensor, a tone will play to indicate to the user that they have managed to accurately hit the punching bag. Otherwise, there were no other technical failures during the visit. Operational details that could be revised upon include creating more surface area at the tip of the arms to ensure that the photosensor is fully covered when the user manages to score a hit. We will also focus on refining some aesthetic details such as encasing exposed wires or shortening the metal rod protruding from the punching bag mechanism so it does not present as a safety hazard.

Revision Analysis

For the next iteration, we hope to revise the fundamental experience so that our project is a two-player competitive game. This would require creating another “boxer” with the same functionalities as the first one. To resolve the technical failure of the sound not working, we would need to figure out whether it is a problem with the photosensor we are using or whether it is an error in the logic of our code. A new capability that could be added includes providing the user the option to move their boxer horizontally to avoid hits by their opponent. To allow users to move their boxers, an accelerometer can be installed on the button case to detect tilt angle so that the user can tilt their cases to have their boxer move in a certain direction. We will test revision by using our finished device for an extended period of time.

Task List:

-build another boxer

-increase surface area of the tips of arms to increase likelihood of photosensor being triggered

-reach goal: implement horizontal motion of boxers

#include <Servo.h&gt;
Servo arm1; 
Servo arm2;
Servo bag;
const int SERVO_ARM1 = 7;
const int SERVO_ARM2 = 4;
const int SWITCH_ARM1=A4;
const int SWITCH_ARM2=A5;
const int LIGHT_SENSOR = A0;
const int speakerPin = 11;
bool arm1_strike = false;
bool arm2_strike= false;
int arm1State = 0; //0 is retracted, 1 is extending, 2 is retracting
int arm2State = 0; 
int arm1Timer = 0;
int arm2Timer = 0;
int toneTimer = 0;
int toneState = 0; //0 is not playing tone, 1 is playing tone
int bagState = 0;
int bagTimer = 0;
void setup() {
  // put your setup code here, to run once:
  arm1.attach( SERVO_ARM1);
  arm2.attach(SERVO_ARM2);
  bag.attach(8);
  bag.write(0);
  arm1.write(180);
  arm2.write(0);
  Serial.begin(9600);

}


float sampleLightSensor(){
  float total = 0.0;
  for(int i = 0; i < 5; i++){
    total += analogRead(LIGHT_SENSOR);
    delay(5);
  }
  return total/10;
}
void loop() 
{
  if (bagState == 0 and millis() - bagTimer &gt; 1000){
    bagState = 1;
    bag.write(180);
    bagTimer = millis();
  }
  if (bagState == 1 and millis - bagTimer &gt; 1000){
    bagState = 0;
    bag.write(0);
    bagTimer = millis();
  }
  if(digitalRead(SWITCH_ARM1) == 0 and arm1State == 0){ //arm is retractred and button is pressed 
    arm1State = 1;
    arm1Timer = millis();
    arm1.write(0);
  }
  if (arm1State == 1 and millis() - arm1Timer &gt; 1000){
    arm1State = 2;
    arm1Timer = millis();
    arm1.write(180);
  }
  if (arm1State == 2 and millis() - arm1Timer &gt; 1000){
    arm1State = 0;
  }

  
  if(digitalRead(SWITCH_ARM2) == 0 and arm2State == 0){ //arm is retractred and button is pressed 
    arm2State = 1;
    arm2Timer = millis();
    arm2.write(180);
  }
  if (arm2State == 1 and millis() - arm2Timer &gt; 1000){
    arm2State = 2;
    arm2Timer = millis();
    arm2.write(0);
  }
  if (arm2State == 2 and millis() - arm2Timer &gt; 1000){
    arm2State = 0;
  }
  
  if(analogRead(LIGHT_SENSOR)< 500 and toneState == 0)
  {
    Serial.println("tone started");
    tone(speakerPin, 440);
    toneTimer = millis();
    toneState = 1;
  }
  if (toneState == 1 &amp;&amp; millis() - toneTimer &gt; 500){
    Serial.println("tone over");
    noTone(speakerPin);
    toneState = 2;
  }
  if (toneState ==2  &amp;&amp; analogRead(LIGHT_SENSOR) &gt; 700){
    toneState = 0;
  }

  
 
  
}